PLSQL Basics
PLSQL Basics
Oracle Tutorials
PL/SQL
Procedural Language / Structured Query Language
Zbigniew Baranowski
Agenda
Overview of PL/SQL
Blocks
Variables and placeholders
Program Flow Control Statements
Cursors
Functions and Procedures
Error Handling
Packages
Triggers
Jobs
Type of block
Anonymous
External scripts (file or input)
Nested blocks
Named / Stored (on the database)
Oracle Tutorials: PL/SQL
1 June 2006 4
PL/SQL execution
Composite/vector type
record
used for reading rows from table
Collections
Associative Array - dictionary
Variable-sized Array (VARRAY) – fixed size
Nested Tables – dynamic size
Oracle Tutorials: PL/SQL
1 June 2006 8
PL/SQL placeholders
Scalar type
variable
constant
DECLARE
l_x NUMBER := 20000;
l_message VARCHAR2(40);
C_PI CONSTANT NUMBER(3,2):=3.14;
BEGIN
l_x := 1000 * C_PI;
l_message := 'Hello world';
END;
Collections
TYPE T_TIME IS RECORD (minutes INTEGER, hours NUMBER(2));
current_time_rec T_TIME;
Associative Array
Current_time_rec.hours := 12;
Variable-sized Array (VARRAY)
Nested Tables
Oracle Tutorials: PL/SQL
1 June 2006 10
PL/SQL placeholders
Scalar type
DECLARE
variable
TYPE T_POPULATION IS TABLE OF NUMBER INDEX BY VARCHAR2(64);
constant
l_city_population T_POPULATION;
l_i number;
BEGIN
Single composite/vector type := 2000;
l_city_population('Smallville')
l_i:= l_city_population('Smallville') ;
record
END;
used for reading rows from table
/
Collections
Associative Array
Variable-sized Array (VARRAY)
Nested Tables
Oracle Tutorials: PL/SQL
1 June 2006 11
PL/SQL placeholders
DECLAREScalar type
TYPE T_FOURSOME IS VARRAY(4) OF VARCHAR2(15);
variable
l_team T_FOURSOME := T_FOURSOME('John', 'Mary', 'Alberto');
BEGIN constant
l_team.EXTEND; -- Append one null element
l_team(4):='Mike'; -- Set 5th element element
Single composite/vector type
DBMS_OUTPUT.PUT_LINE( l_team( l_team.first ) ); -- Print first element
DBMS_OUTPUT.PUT_LINE( l_team( l_team.last ) ); -- Print last element
record
Collections
Associative Array
Variable-sized Array (VARRAY)
Nested Tables
Oracle Tutorials: PL/SQL
1 June 2006 12
PL/SQL placeholders
Scalar type
DECLARE
variable
TYPE T_ROSTER IS TABLE OF VARCHAR2(15);
l_names T_ROSTER := T_ROSTER('D Caruso', 'J Hamil', 'D Piro', 'R Singh');
constant
l_i number;
BEGIN
FOR l_i IN l_names.FIRST .. L_names.LAST LOOP --For first to last element
Single composite/vector type
DBMS_OUTPUT.PUT_LINE(l_names(l_i));
END LOOP;
record
END;
used for reading rows from table
/
Collections
Associative Array
Variable-sized Array (VARRAY)
Nested Tables
Oracle Tutorials: PL/SQL
1 June 2006 13
Attributes %TYPE & %ROWTYPE
variable declarations
balance NUMBER(7,2);
minimum_balance balance%TYPE := 10.00;
my_dname scott.dept.dname%TYPE;
dept_rec dept%ROWTYPE;
DECLARE
DECLARE := 20000;
l_sales NUMBER(8,2)
l_grade CHAR(1) := 'B';
l_bonus NUMBER(6,2);
BEGIN BEGIN
CASETHEN
IF l_sales > 50000 l_grade
l_bonus := 1500;
WHEN l_bonus
ELSIF l_sales > 35000 THEN 'A' THEN
:= 500;
DBMS_OUTPUT.PUT_LINE('Excellent');
ELSE l_bonus := 100;
END IF; WHEN 'B' THEN DBMS_OUTPUT.PUT_LINE('Very
Good');
UPDATE employees SET salary = salary + l_bonus;
WHEN 'C' THEN DBMS_OUTPUT.PUT_LINE('Good');
END;
WHEN 'D' THEN DBMS_OUTPUT.PUT_LINE('Fair');
WHEN 'F' THEN DBMS_OUTPUT.PUT_LINE('Poor');
ELSE DBMS_OUTPUT.PUT_LINE('No such grade');
Sequential Control END CASE;
END;
Using GOTO statement
Oracle Tutorials: PL/SQL
1 June 2006 16
PL/SQL Control Structures
Iterative loops DECLARE
l_i NUMBER := 0;
Simple loop (infinite) BEGIN
LOOP
WHILE loop DBMS_OUTPUT.PUT_LINE (TO_CHAR(l_i));
l_i:=l_i+1;
FOR loop END LOOP;
1 June 2006
Oracle Tutorials: PL/SQL 17
PL/SQL Control Structures
Iterative loops DECLARE
l_i NUMBER := 0;
Named loops l_j NUMBER := 0;
l_s NUMBER :=0;
BEGIN
<<outer_loop>>
Exiting loops LOOP
l_i := l_i + 1;
EXIT statement <<inner_loop>>
LOOP
Loop skipping l_j := l_j + 1;
l_s := l_s + l_i * l_j;
CONTINUE EXIT inner_loop WHEN (l_j >
5);
EXIT outer_loop WHEN ((l_i
* l_j) > 15);
END LOOP inner_loop;
DBMS_OUTPUT.PUT_LINE('Sum:'||
TO_CHAR(l_s));
IF l_s > 100 THEN EXIT;
END IF;
Oracle Tutorials:
END LOOPPL/SQL
outer_loop;
1 June 2006 END; 18
Accessing Data in the Database
Selecting at most one row:
SELECT INTO statement
1 June 2006
Oracle Tutorials: PL/SQL 20
Defining explicit cursors
The simplest cursor:
CURSOR my_cursor IS SELECT * from table;
DECLARE
l_employees employees%ROWTYPE;
CURSOR l_c (p_low NUMBER DEFAULT 0, p_high NUMBER DEFAULT 99) is
SELECT * FROM employees WHERE job_id > p_low AND job_id < p_high;
BEGIN
OPEN l_c(3,20);
LOOP
FETCH l_c INTO l_employees;
EXIT WHEN l_c%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(l_employees.last_name || l_employees.job_id );
END LOOP;
CLOSE l_c;
END;
Dynamic PL/SQL
plsql_block := 'BEGIN calc_stats(:x, :x, :y, :x); END;';
EXECUTE IMMEDIATE plsql_block USING a, b;
Procedure definition
Procedure invocation
EXE$RAISE_SALARY(emp_num, bonus);
EXE$RAISE_SALARY(l_amount => bonus, l_emp_id => emp_num);
EXE$RAISE_SALARY(emp_num, l_amount => bonus);
Oracle Tutorials: PL/SQL
1 June 2006 28
PL/SQL Functions
Function definition
CREATE OR REPLACE FUNCTION STF$HALF_OF_SQUARE (p_original NUMBER)
RETURN NUMBER IS
BEGIN
RETURN (p_original * p_original)/2 + (p_original * 4);
END STF$HALF_OF_SQUARE;
Function invocation
square INTEGER := STF$HALF_OF_SQUARE(25);
-- USER2
execute user1.myprocedure;
Invoker rights
create or replace function procedure_name authid current_user
is…
Exception to be handled
in the exception section or
will be propagated to the enclosing block
After the exception is handled, the control passes to
the enclosing block
DECLARE
l_out_of_stock EXCEPTION;
l_number_on_hand NUMBER := 0;
BEGIN
IF l_number_on_hand < 1 THEN
RAISE l_out_of_stock;
END IF;
EXCEPTION
WHEN l_out_of_stock THEN
DBMS_OUTPUT.PUT_LINE ( 'Encountered out of stock error' );
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE ( 'Houston we''ve got a problem!' );
END;
END; Oracle Tutorials: PL/SQL
1 June 2006 34
Packages
Group logically related PL/SQL types, items and
modules
2 parts:
Specification public interface
Body private implementation
Packages are global
Cannot be called, parameterized, or nested.
Package state persist for the duration of the database
session
Header
Declarations of global types and variables
Specification of cursors
With RETURN clause, but no SELECT statement
Specification of public modules
device
UTL_HTTP: makes HTTP callouts.
Many others…
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'my_new_job1',
program_name => 'my_saved_procedure',
repeat_interval => 'FREQ=DAILY;BYHOUR=12',
comments => 'Daily at noon');
END;
/