# Finding sum of first n natural numbers in PL/SQL

Prerequisite PL/SQL introduction
In PL/SQL code groups of commands are arranged within a block. A block group related declarations or statements. In declare part, we declare variables and between begin and end part, we perform the operations.
Given a positive integer n and the task is to find the sum of first n natural number.
Examples:

```Input: n = 3
Output: 10

Input: n = 2
Output: 4
```

Approach is to take digits form 1 and to n and summing like done below-

```Sum of first natural number: 1
Sum of first and second natural number: 1 + 2 = 3
Sum of first, second and third natural number = 1 + 2 + 3 = 6```

Below is the required implementation:

 `--declaration section  ` `DECLARE`  `  ``x NUMBER;  ` `  ``n NUMBER;  ` `  ``i NUMBER;  ` `   `  `  ``--function for finding sum  ` `  ``FUNCTION` `Findmax(n ``IN` `NUMBER)  ` `    ``RETURN` `NUMBER  ` `  ``IS`  `    ``sums NUMBER := 0;  ` `  ``BEGIN`  `   `  `    ``--for loop for n times iteration  ` `    ``FOR` `i ``IN` `1..n  ` `    ``LOOP  ` `      ``sums := sums + i*(i+1)/2;  ` `    ``END` `LOOP;  ` `    ``RETURN` `sums;  ` `  ``END``;  ` `  ``BEGIN`  `   `  `    ``--driver code  ` `    ``n := 4;  ` `    ``x := findmax(n);  ` `    ``dbms_output.Put_line(``'Sum: '`  `    ``|| x);  ` `  ``END``;  ` `   `  `  ``--end of Program `

Output:

`Sum: 20`

Time complexity = O(n)

An efficient solution is to use direct formula n(n+1)(n+2)/6

Mathematically, we need to find, Σ ((i * (i + 1))/2), where 1 <= i <= n
So, lets solve this summation,

```Sum = Σ ((i * (i + 1))/2), where 1 <= i <= n
= (1/2) * Σ (i * (i + 1))
= (1/2) * Σ (i2 + i)
= (1/2) * (Σ i2 + Σ i)

We know Σ i2 = n * (n + 1) * (2*n + 1) / 6 and
Σ i = n * ( n + 1) / 2.
Substituting the value, we get,
Sum = (1/2) * ((n * (n + 1) * (2*n + 1) / 6) + (n * ( n + 1) / 2))
= n * (n + 1)/2 [(2n + 1)/6 + 1/2]
= n * (n + 1) * (n + 2) / 6```

Below is the required implementation:

 `--declaration section  ` `DECLARE`  `  ``x NUMBER;  ` `  ``n NUMBER;  ` `   `  `  ``--utility function  ` `  ``FUNCTION` `Findmax(n ``IN` `NUMBER)  ` `    ``RETURN` `NUMBER  ` `  ``IS`  `    ``z NUMBER;  ` `  ``BEGIN`  `   `  `    ``-- formula for finding sum  ` `    ``z := (n * (n + 1) * (n + 2)) / 6;  ` `    ``RETURN` `z;  ` `  ``END``;  ` `  ``BEGIN`  `    ``n := 4;  ` `    ``x := findmax(n);  ` `    ``dbms_output.Put_line(``' Sum: '`  `    ``|| x);  ` `  ``END``;  ` `   `  `  ``--end of program `

Output:

`Sum: 20`

Time complexity = O(1)

## tags:

SQL SQL-PL/SQL SQL