Chapter 4 PL/SQL
IF SYNTAX :
IF (CONDITION ) THEN
<STATEMENTS>;
END IF;
NESTED IF SYNTAX :
IF ( CONDITION ) THEN
IF ( CONDITION ) THEN
< STATEMENTS >
ELSE
IF ( CONDITION ) THEN
< STATEMENTS >
ELSIF ( CONDITION ) THEN
< STATEMENTS >
END IF;
END IF;
END IF;
CASE SYNTAX :
CASE ( EXPRESSION )
WHEN < CONDITON 1 > THEN
RESULT 1;
WHEN < CONDITION 2 > THEN
RESULT 2;
WHEN < CONDITION N > THEN
RESULT N;
ELSE
RESULT;
END CASE;
LOOP :
1. SYNTAX:
LOOP
<LOOP BODY>
EXIT WHEN (CONDITION)
END LOOP;
2. SYNTAX FOR ENDLESS LOOP :
LOOP
< LOOP BODY >
END LOOP;
3. SYNTAX FOR WHLIE LOOP :
WHILE ( CONDITION )
LOOP
< LOOP BODY >
END LOOP;
4. SYNTAX FOR FOR LOOP :
FOR i IN 1 . . N LOOP
< LOOP BODY >
END LOOP;
WRITE PL/SQL CODE TO CHECK WHETHER NO IS EVEN OR ODD :
declare
n number(10):=&n;
begin
if mod(n,2)= 0 then
dbms_output.put_line(‘number is even’);
else
dbms_output.put_line(‘number is odd’);
end if;
end;
Enter value for n: 4
old 2: N NUMBER(10):=&N;
new 2: N NUMBER(10):=4;
NUMBER IS EVEN
PL/SQL procedure successfully completed.
PROGRAM TO FIND FACTORIAL OF A USER DEFINED NUMBER :
declare
n number(10):=&n;
i number;
fact number(20):=1;
begin
for i in 1..n loop
fact := fact*i;
end loop;
dbms_output.put_line(‘factorial of ’||n||’ = ’||fact);
end;
Enter value for n: 5
old 2: n number(10):=&n;
new 2: n number(10):=5;
factorial of 5 = 120
PL/SQL procedure successfully completed.
CODE TO ACCEPT 3 NUMBERS AND DISPLAY THE LARGEST NUMBER.
DECLARE
n1 number(20):=&n1;
n2 number(20):=& n2;
n3 number(20):= &n3;
begin
IF (n1>n2) and (n1>n3) THEN
dbms_output.put_line(n1||'is greater');
ELSIF (n2>n1) and (n2>n3) then
dbms_output.put_line(n2||'is greater');
ELSE
dbms_output.put_line(n3||'is greater');
END IF;
end;
Enter value for n1: 7
old 2: n1 number(20):=&n1;
new 2: n1 number(20):=7;
Enter value for n2: 5
old 3: n2 number(20):=& n2;
new 3: n2 number(20):=5;
Enter value for n3: 2
old 4: n3 number(20):= &n3;
new 4: n3 number(20):= 2;
7is greater
PROGRAM TO DECLARE A CHARACTER VARIABLE ,ASSIGN ANY ALPHABET TO IT
AND DISPLAY WHETHER THE ENTERED ALPHABET IS VOWEL OR CONSONANT
USING CASE STATEMENT :
declare
choice VARchar2(1);
message VARchar2(100);
begin
choice:='&choice';
message:=
case choice
when 'a' then 'is vowel'
when 'e' then 'is vowel'
when 'i' then 'is vowel'
when 'o' then 'is vowel'
when 'u' then 'is vowel'
else 'is consonant'
end ;
dbms_output.put_line(choice||message);
end;
Enter value for choice: A
old 5: choice:='&choice';
new 5: choice:='A';
Ais consonant
PL/SQL procedure successfully completed.
IMPLICIT CURSOR.
Declare
total_rows number(5);
Begin
Update emp
Set sal= sal+1000;
If SQL%NOTFOUND then
dbms_output.put_line('NO EMPLOYEE SELECTED');
ELSIF SQL%FOUND then
total_rows:= SQL%rowcount;
dbms_output.put_line(total_rows||' TOTAL EMPLOYEES FOUND');
END IF;
END;
14 TOTAL EMPLOYEES FOUND
1. ROWID TYPE:
Declare
Cursor emp_cursor is select
ename,empno from emp;
erecord emp % rowidtype;
begin
open emp_cursor;
fetch emp_cursor into erecord;
dbms_output.put_line(erecord);
close emp_cursor;
END;
2. PARAMETERIZED CURSOR:
Declare
my_record emp%rowid type;
cursor c1(max_wage number) is select * from emp where sal<max_wage;
begin c1(1000);
loop
fetch c1 into my_record;
exit when c1 %not found
dbms_output.put_line(‘NAME=’||myrecord.ename||’salary=’||my_record.sal);
end loop;
end;
3. TO EVERY ROW FROM CURSOR WITHOUT MANAGING THE CURSOR’S
EXECUTION CYCLE IE. OPEN, CLOSE AND FETCH:
Declare
Cursor cur_emp is select ename,sal from emp;
Begin
For emp in cur_emp
Loop
dbms_output.put_line(emp.ename||’ gets’||emp.sal);
end loop;
end;
EXPLICIT CURSOR.
DECLARE
E_ID EMP.EMPNO%TYPE;
E_NAME EMP.ENAME%TYPE;
CURSOR EMP_CURSOR IS SELECT EMPNO,ENAME FROM EMP;
BEGIN
OPEN EMP_CURSOR;
LOOP
FETCH EMP_CURSOR INTO E_ID,E_NAME;
EXIT WHEN EMP_CURSOR%NOTFOUND;
END LOOP;
DBMS_OUTPUT.PUT_LINE(E_ID||’ ‘||E_NAME);
CLOSE EMP_CURSOR;
END;
7934 MILLER
PL/SQL procedure successfully completed.
PREDEFINED EXCEPTION.
SYNTAX :
DECLARE
<DECLARATION STATEMENTS>
BEGIN
<EXECUTABLE STATEMENTS>
EXCEPTION
WHEN <EXCEPTION 1> THEN
EXCEPTION HANDLING STATEMENTS;
WHEN OTHERS THEN
EXCEPTION HANDLING STATEMENTS;
END;
EXAMPLE :
DECLARE
E_ID EMP.EMPNO %TYPE:=8;
E_NAME EMP.ENAME%TYPE;
BEGIN
SELECT ENAME INTO E_NAME FROM EMP
WHERE EMPNO=E_ID;
DBMS_OUTPUT.PUT_LINE('NAME OF THE EMPLOYEE ='||E_NAME);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('NO SUCH EMPLOYEES');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERRORS');
END;
/
NO SUCH EMPLOYEES
PL/SQL procedure successfully completed.
USERDEFINED EXCEPTION :
SYNTAX :
DECLARE
<DECLARATION STATEMENTS>
<EXCEPTION NAME> EXCEPTION
BEGIN
<SQL STATEMENTS>
IF (CONDITION) THEN
RAISE <EXCEPTION NAME>
END IF
EXCEPTION
WHEN <EXCEPTION NAME>
THEN EXCEPTION HANDLING
STATEMENTS;
END;
EXAMPLE:
DECLARE
E_ID EMP.EMPNO%TYPE:=8;
E_NAME EMP.ENAME%TYPE;
EX_INVALID_ID EXCEPTION;
BEGIN
IF E_ID<=0 THEN
RAISE EX_INVALID_ID;
ELSE
SELECT ENAME INTO E_NAME FROM EMP WHERE EMPNO=E_ID;
DBMS_OUTPUT.PUT_LINE(E_NAME||‘ ARE THE EMPLOYEES’);
END IF;
EXCEPTION
WHEN EX_INVALID_ID THEN
DBMS_OUTPUT.PUT_LINE(‘ID MUST BE GREATER THAN ZERO’);
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE(‘DATA NOT FOUND’);
END;
DATA NOT FOUND
PL/SQL procedure successfully completed.
PROCEDURE :
1) SYNTAX TO CREATE :
CREATE PROCEDURE <PROCEDURE NAME>
{( PARAMETER [IN/OUT/INOUT] ) TYPE…….}
{ IS/AS }
BEGIN
<PROCEDURE BODY>
END;
2) SYNTAX TO DELETE :
DROP PROCEDURE <PROCEDURE NAME>;
3) EXAMPLE :
DECLARE
A NUMBER;
PROCEDURE SQUARENUM(X IN OUT NUMBER)
IS
BEGIN
X:= X*X;
END;
BEGIN
A:=25;
SQUARENUM(A);
DBMS_OUTPUT.PUT_LINE(‘SQUARE IS ’||A);
END;
SQUARE IS 625
PL/SQL procedure successfully completed.
4) PROCEDURE TO FIND OUT THE MINIMUM OF TWO NUMBER
DECLARE
A NUMBER(3);
B NUMBER(4);
C NUMBER(3);
PROCEDURE FINDMIN(X IN NUMBER, Y IN NUMBER, Z OUT NUMBER)
IS
BEGIN
IF X<Y THEN
Z:=X;
ELSE
Z:=Y;
END IF ;
END;
BEGIN
A:=23;
B:=50;
FINDMIN(A,B,C);
DBMS_OUTPUT.PUT_LINE(C);
END;
23
PL/SQL procedure successfully completed.
FUNCTIONS
SYNTAX TO CREATE:
CREATE OR REPLACE FUNCTION <FUNCTION NAME>
[PARAMETER [IN] TYPE]
RETURN DATATYPE IS PARAMETER DATATYPE
BEGIN
<FUNCTION BODY>
END;
EXAMPLE :
DECLARE
A NUMBER (3);
B NUMBER(3);
C NUMBER(3);
FUNCTION FINDMIN (X IN NUMBER,Y IN NUMBER) RETURN NUMBER IS
Z NUMBER;
BEGIN
IF X<Y THEN
Z:=X;
ELSE
Z:=Y;
END IF;
RETURN Z;
END;
BEGIN
A:=23;
B:=50;
C:=FINDMIN(A,B);
DBMS_OUTPUT.PUT_LINE(C);
END;
23
PL/SQL procedure successfully completed.
TRIGGERS :
SYNTAX TO CREATE:
CREATE [OR REPLACE] TRIGGER <TRIGGERNMAE>
{ BEFORE/AFTER } { DELETE/INSERT/UPDATE [OF COLUMN] }
ON TABLE [ FOR EACH ROW ]
[WHEN < CONDITION>]
DECLARE
<DECLARATION STATEMENTS>
BEGIN
<PL/SQL SUBPROGRAM BODY>
EXCEPTION
EXECUTION BODY
END;
SYNTAX TO DELETE :
DROP TRIGGER <TRIGGER NAME>;
EXAMPLE:
CREATE OR REPLACE TRIGGER SALARY
AFTER UPDATE OF SAL ON EMP
BEGIN
IF : NEW SAL>1000 THEN
UPDATE EMP
SET SAL:=15000;
ELSE RASIE_APPLICATION_ERROR
( ‘YOU CANNOT UPDATE RECORD ’ );
END IF;
END;
Warning: Trigger created with compilation errors.