PL SQL LAB
PL SQL LAB
Language
PL/SQL
Two types of Variable Scope
Local Variable
Available only in inner block
Global variable
It is declared in outermost block and available
in all blocks.
DECLARE
a integer := 40;
b integer := 10;
c integer;
f real;
BEGIN
c := a + b;
dbms_output.put_line('Value of c: ' || c);
f := 25.0/3.0;
dbms_output.put_line('Value of f: ' || f);
END;
DECLARE
temp varchar(20);
BEGIN
SELECT g_id into temp from geeks where g_name='GeeksforGeeks';
exception
WHEN no_data_found THEN
dbms_output.put_line('ERROR');
dbms_output.put_line('there is no name as');
dbms_output.put_line(‘Desired');
end;
DECLARE
num1 number := 95;
num2 number := 85;
BEGIN
dbms_output.put_line('Outer Variable num1: ' || num1);
dbms_output.put_line('Outer Variable num2: ' || num2);
DECLARE
num1 number := 195;
num2 number := 185;
BEGIN
dbms_output.put_line('Inner Variable num1: ' || num1);
dbms_output.put_line('Inner Variable num2: ' || num2);
END;
END;
S.No Data Type & Description
CHAR
1
Fixed-length character string with maximum size of 32,767 bytes
VARCHAR2
2
Variable-length character string with maximum size of 32,767 bytes
RAW
3
Variable-length binary or byte string with maximum size of 32,767 bytes, not interpreted by PL/SQL
NCHAR
4
Fixed-length national character string with maximum size of 32,767 bytes
NVARCHAR2
5
Variable-length national character string with maximum size of 32,767 bytes
LONG
6
Variable-length character string with maximum size of 32,760 bytes
LONG RAW
7
Variable-length binary or byte string with maximum size of 32,760 bytes, not interpreted by PL/SQL
Using %Type for defining Variable
Declare
v_name employee.lastname%TYPE;
Begin
select lastname into v_name from EMPLOYEE where
DEPARTMENTID=v_min_dep;
DBMS_OUTPUT.PUT_LINE('v_name: '||v_name);
end;
Various Control Statements
Samples
IF new_balance < minimum_balance THEN overdrawn := TRUE; ELSE
overdrawn := FALSE; END IF;
DECLARE
PROCEDURE p ( sales NUMBER, quota NUMBER, emp_id NUMBER )
IS
bonus NUMBER := 0;
updated VARCHAR2(3) := 'No’;
BEGIN IF sales > (quota + 200)
THEN
bonus := (sales - quota)/4; UPDATE employees SET salary = salary +
bonus
WHERE employee_id = emp_id;
updated := 'Yes’;
DECLARE PROCEDURE p
( sales NUMBER, quota NUMBER, emp_id NUMBER )
IS
bonus NUMBER := 0;
BEGIN
IF sales > (quota + 200)
THEN bonus := (sales - quota)/4;
ELSE bonus := 50;
END IF;
DBMS_OUTPUT.PUT_LINE('bonus = ' || bonus);
UPDATE employees
SET salary = salary + bonus WHERE employee_id = emp_id;
END p;
BEGIN p(10100, 10000, 120);
p(10500, 10000, 121);
END; /
3.Nested IF-THEN-ELSE Statement
DECLARE
PROCEDURE p ( sales NUMBER, quota NUMBER, emp_id NUMBER )
IS
bonus NUMBER := 0;
BEGIN
IF sales > (quota + 200) THEN
bonus := (sales - quota)/4;
ELSE
IF sales > quota THEN
bonus := 50;
ELSE
bonus := 0;
END IF;
END IF;
DBMS_OUTPUT.PUT_LINE('bonus = ' || bonus);
UPDATE employees SET salary = salary + bonus
WHERE employee_id = emp_id;
END p;
BEGIN
p(10100, 10000, 120);
p(10500, 10000, 121);
p(9500, 10000, 122);
END; /
4.Nested IF-THEN-ELSE Statement
DECLARE
PROCEDURE p
(sales NUMBER)
IS
bonus NUMBER := 0;
BEGIN
IF sales > 50000 THEN
bonus := 1500;
ELSIF sales > 35000 THEN
bonus := 500;
ELSE bonus := 100;
END IF;
DBMS_OUTPUT.PUT_LINE ( 'Sales = ' || sales || ', bonus = ' || bonus || '.’ );
END p;
BEGIN
p(55000);
p(40000);
p(30000);
END; /
6. Simple CASE Statement
CASE selector
WHEN selector_value_1 THEN statements_1
WHEN selector_value_2 THEN statements_2 ...
WHEN selector_value_n THEN statements_n
ELSE else_statements
END CASE;
DECLARE
grade CHAR(1);
BEGIN
grade := 'B’;
CASE grade
WHEN 'A' THEN DBMS_OUTPUT.PUT_LINE('Excellent’);
WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('Very Good’);
WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('Good’);
WHEN 'D' THEN DBMS_OUTPUT.PUT_LINE('Fair’);
WHEN 'F' THEN DBMS_OUTPUT.PUT_LINE('Poor’);
ELSE DBMS_OUTPUT.PUT_LINE('No such grade’);
END CASE;
END; /
7. Searched CASE Statement
CASE
WHEN condition_1
THEN statements_1
WHEN condition_2
THEN statements_2 ...
WHEN condition_n
THEN statements_n
ELSE else_statements
END CASE;
DECLARE
grade CHAR(1);
BEGIN
grade := 'B’;
CASE
WHEN grade = 'A' THEN DBMS_OUTPUT.PUT_LINE('Excellent’);
WHEN grade = 'B' THEN DBMS_OUTPUT.PUT_LINE('Very Good’);
WHEN grade = 'C' THEN DBMS_OUTPUT.PUT_LINE('Good’);
WHEN grade = 'D' THEN DBMS_OUTPUT.PUT_LINE('Fair’);
WHEN grade = 'F' THEN DBMS_OUTPUT.PUT_LINE('Poor’);
ELSE DBMS_OUTPUT.PUT_LINE('No such grade’);
END CASE;
END;
LOOP Statements
LOOP
statements
END LOOP ;
Sample
DECLARE
x NUMBER := 0;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE ('Inside loop: x = ' || TO_CHAR(x));
x := x + 1;
IF x > 3
THEN EXIT;
END IF;
END LOOP;
DBMS_OUTPUT.PUT_LINE(' After loop: x = ' || TO_CHAR(x));
END;
9. EXIT WHEN Statement
DECLARE
x NUMBER := 0;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE('Inside loop: x = ' || TO_CHAR(x));
x := x + 1;
EXIT WHEN x > 3;
END LOOP;
DBMS_OUTPUT.PUT_LINE('After loop: x = ' || TO_CHAR(x));
END;
DECLARE
i PLS_INTEGER := 0;
j PLS_INTEGER := 0;
BEGIN
LOOP
i := i + 1;
DBMS_OUTPUT.PUT_LINE ('i = ' || i);
LOOP
j := j + 1;
DBMS_OUTPUT.PUT_LINE ('j = ' || j);
EXIT WHEN (j > 3);
END LOOP;
DBMS_OUTPUT.PUT_LINE ('Exited inner loop’);
EXIT WHEN (i > 2);
END LOOP;
DBMS_OUTPUT.PUT_LINE ('Exited outer loop’);
END;
10. Continue Statement
DECLARE
x NUMBER := 0;
BEGIN
LOOP
DBMS_OUTPUT.PUT_LINE ('Inside loop: x = ' || TO_CHAR(x));
x := x + 1;
CONTINUE WHEN x < 3;
DBMS_OUTPUT.PUT_LINE ('Inside loop, after CONTINUE: x = ' || TO_CHAR(x));
EXIT WHEN x = 5;
END LOOP;
DBMS_OUTPUT.PUT_LINE (' After loop: x = ' || TO_CHAR(x));
END;
11. For Statement
BEGIN
DBMS_OUTPUT.PUT_LINE ('lower_bound < upper_bound’);
FOR i IN 1..3
LOOP
DBMS_OUTPUT.PUT_LINE (i);
END LOOP;
DBMS_OUTPUT.PUT_LINE ('lower_bound = upper_bound’);
FOR i IN 2..2
LOOP DBMS_OUTPUT.PUT_LINE (i);
END LOOP;
DBMS_OUTPUT.PUT_LINE ('lower_bound > upper_bound’);
FOR i IN 3..1
LOOP DBMS_OUTPUT.PUT_LINE (i);
END LOOP;
END;
12. WHILE LOOP Statement
WHILE condition
LOOP statements
END LOOP;
DECLARE
done BOOLEAN := FALSE;
BEGIN
WHILE done
LOOP DBMS_OUTPUT.PUT_LINE ('This line does not print.’);
done := TRUE;
END LOOP;
WHILE NOT done
LOOP DBMS_OUTPUT.PUT_LINE ('Hello, world!’);
done := TRUE;
END LOOP;
END;
PL/SQL Cursor
Declare a cursor
CURSOR cursor_name IS query
Open a cursor
Open Cursor_name
Fetch from a cursor
Fetch cursor_name into variable_list;
Close Cursor_name
Explicit Cursor Attributes
%ISOPEN
When cursor open true
When cursor is not open false
%FOUND
True when successfully record fetched
False when no record found
%NOTFOUND
It’s value is opposite of %FOUND
%ROWCOUNT
number of rows fetched from the cursor
DECLARE
x NUMBER := 100;
BEGIN
FOR i IN 1..10 LOOP
IF MOD(i,2) = 0 THEN
INSERT INTO temp VALUES (i, x, 'i is even');
ELSE
INSERT INTO temp VALUES (i, x, 'i is odd');
END IF;
x := x + 100;
END LOOP ;
COMMIT;
END;
DECLARE
CURSOR c1 is
SELECT ename, empno, sal FROM emp ORDER BY sal DESC;
my_ename VARCHAR2(10);
my_empno NUMBER(4);
my_sal NUMBER(7,2);
BEGIN
OPEN c1;
FOR i IN 1..5
LOOP
FETCH c1 INTO my_ename, my_empno, my_sal;
EXIT WHEN c1%NOTFOUND;
INSERT INTO temp VALUES (my_sal, my_empno, my_ename);
COMMIT;
END LOOP;
CLOSE c1;
END;