Session 17
Session 17
Contents
• Lecture 1
• Why PL/SQL
• Basics
• Lectures 2 and 3
• Advanced PL/SQL
2
Limits of SQL
Bank clerk
Wants to do withdrawal transaction for a person for
some amount.
3
An IF Statement in SQL
UPDATE Accounts
SET balance = balance - &amount
WHERE holder = '&person' AND balance > &amount;
4
SQL Limitation
• Cannot express business logic well
• Supports
• Variables and constants
• Structured data
• Assignment statements
• Loops
• Conditional
• Error handling
• Integrated with SQL
6
Example in PL/SQL
PROCEDURE withdrawal(person IN varchar(20),
amount IN REAL ) IS
current REAL;
BEGIN
SELECT balance INTO current
FROM Accounts
WHERE holder = person;
IF (amount > current) THEN
dbms_output.put_line('Insufficient Funds');
ELSE
UPDATE Accounts
SET balance = balance - amount
WHERE holder = person AND balance > amount;
COMMIT;
END IF;
END;
http://www.cse.unsw.edu.au/~cs3311/98s2/lec/plsql/notes.html
7
PROCEDURE withdrawal(person IN varchar(20),
Example in PL/SQL
amount IN REAL
current REAL;
) IS
BEGIN
SELECT balance INTO current
FROM Accounts
WHERE holder = person;
IF (amount > current)
dbms_output.put_line('Insufficient Funds');
ELSE
UPDATE Accounts
SET balance = balance - amount
WHERE holder = person AND balance > amount;
COMMIT;
END IF; Package and execute as
END; functional unit
9
Hello World – Anonymous Block
SET SERVEROUTPUT ON
BEGIN
DBMS_OUTPUT.PUT_LINE (‘Hello’);
END;
/
10
Hello World - Procedure
12
Program Structure
• May span multiple text editor lines
• Comments /* */
DECLARE
varname dataType [ NOTNULL ]
[:= initialvalue] | [DEFAULT initialvalue] ;
DECLARE
v_num NUMBER (3);
v_sum NUMBER (2) := 0;
v_major VARCHAR2 (5) DEFAULT ‘CIS’;
c_pi CONSTANT NUMBER :=3.14;
v_date DATE DEFAULT sysdate;
16
Printing in PL/SQL
SET SERVEROUTPUT ON SIZE buffer_size;
DECLARE
v_num NUMBER (2);
BEGIN
v_num := 50
v_double := v_num * 2;
DBMS_OUTPUT.PUT_LINE ( ‘Number is ‘ || TO_CHAR (v_num));
END;
17
Outputting
• DBMS_OUTPUT.PUT_LINE(string);
18
Program Control Statements
• Assignment statements
• Conditional Statements
• Loops
19
IF-THEN-END IF
• IF condition is true then action statements
performed, otherwise they are skipped
IF condition THEN
programstatements
END IF;
• IF/ELSE/END IF:
IF condition THEN
programstatements
ELSE
stmt-list-2
END IF;
20
IF-THEN-END IF /ELSE IF
IF (v_name = ‘dev’) THEN
v_salary = v_salary * 1.05 ;
v_commission := v_salary *.025 ;
END IF;
21
IF THEN ELSIF END IF
IF v_position_id = 1 THEN
v_salary := v_salary * 1.2 ;
ELSIF v_position_id = 2 THEN
v_salary := v_salary * 1.3 ;
ELSIF v_position_id = 3 THEN
v_salary := v_salary * 1.35 ;
ELSIF v_position_id = 4 THEN
v_salary := v_salary * 1.4 ;
ELSIF
v_salary := v_salary * 2 ;
END IF;
22
Basic Loop LOOP
looping statements
EXIT [WHEN condition];
END LOOP;
BEGIN
v_sum := 100 ;
v_count := 1;
LOOP
v_sum := v_sum + v_count;
v_count := vcount + 1;
EXIT WHEN v_count > 10;
END LOOP;
23
WHILE Loop WHILE condition LOOP
statement-list
END LOOP;
BEGIN
v_sum := 100 ;
v_count := 1;
WHILE v_count <= 10
v_sum := v_sum + v_count;
v_count := vcount + 1;
END LOOP;
24
FOR Statement
FOR counter_variable
IN start_value .. end_value
LOOP
[REVERSE]
program statements
END LOOP;
v_sum := 0;
FOR counter in 1 .. 10 LOOP
v_sum := v_sum + v_count;
END LOOP
25
Exercise Complete exercise
Input a number and
write it out, as well as its
SQL> SET SERVEROUTPUT ON
square, cube and double
DECLARE
V_NUM NUMBER (2);
V_SQUARE NUMBER (3);
V_CUBE NUMBER (4);
V_DOUBLE NUMBER (3);
BEGIN
…. := &NUM;
V_SQUARE := V_NUM * V_NUM;
V_CUBE := V_SQUARE * ...
V_DOUBLE := ...
DBMS_OUTPUT.PUT_LINE
('NUMBER: ' || TO_CHAR (V_NUM));
...
END;
26