0% found this document useful (0 votes)
4 views48 pages

PLSQL Basics

The document provides an overview of PL/SQL including its structure, data types, control structures, and other features. It covers blocks, variables, conditionals, loops, cursors, functions, procedures, packages, triggers and jobs in PL/SQL.

Uploaded by

coolscools123
Copyright
© © All Rights Reserved
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
Download as pptx, pdf, or txt
0% found this document useful (0 votes)
4 views48 pages

PLSQL Basics

The document provides an overview of PL/SQL including its structure, data types, control structures, and other features. It covers blocks, variables, conditionals, loops, cursors, functions, procedures, packages, triggers and jobs in PL/SQL.

Uploaded by

coolscools123
Copyright
© © All Rights Reserved
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1/ 48

Oracle Tutorials: PL/SQL

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

Oracle Tutorials: PL/SQL


1 June 2006 2
PL/SQL
 Procedural language extension to SQL
 procedural data manipulation
 conditionals, loops etc.
 High-level language features
 Complex data types
 Data encapsulation
 Modular programming
 Integrated with the ORACLE database server
 Server-side
 parsing / compilation
 execution / interpretation
 End-user platform independent (like SQL)
Oracle Tutorials: PL/SQL
1 June 2006 3
Writing PL/SQL programs

 Each program is a block consisting of


 PL/SQL statements – logic
 SQL statements – data manipulation

 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

Oracle Tutorials: PL/SQL


1 June 2006 5
PL/SQL Block Structure

DECLARE –-declaration section (types, variables, …)


l_commission NUMBER;
L_COMM_MISSING EXCEPTION;
BEGIN –-executable section (program body)
SELECT commission_pct / 100 INTO l_commission
FROM employees WHERE employee_id = emp_id;
IF l_commission IS NULL THEN RAISE COMM_MISSING;
ELSE UPDATE employees
SET salary = salary + bonus*l_commission
WHERE employee_id = emp_id;
END IF;
EXCEPTION --exception section (error handling)
WHEN L_COMM_MISSING THEN DBMS_OUTPUT.PUT_LINE('This
employee does not receive a commission.');
END;

Oracle Tutorials: PL/SQL


1 June 2006 6
PL/SQL placeholders
 All SQL types are supported by PL/SQL
 Numerical types
 NUMBER, PLS_INTEGER
 Many derived types, e.g. POSITIVE
 Character types
 CHAR, VARCHAR2, NCHAR,…
 Other scalar types
 BOOLEAN, DATE, UROWID, RAW

Oracle Tutorials: PL/SQL


1 June 2006 7
PL/SQL placeholders
 Scalar type
 variable
 constant

 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;

Oracle Tutorials: PL/SQL


1 June 2006 9
PL/SQL placeholders
 Scalar type
 variable
 constant

 Single composite/vector type


 record
 used for reading rows from table

 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

END;  used for reading rows from table


/

 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

 %TYPE references type of a variable or a database


column
 %ROWTYPE references type of a record structure,
table row or a cursor
 Advantages:
 Actual type does not need to be known
 referenced type had changed -> will be recompiled
automatically

Oracle Tutorials: PL/SQL


1 June 2006 14
%TYPE & %ROWTYPE Examples

variable declarations
balance NUMBER(7,2);
minimum_balance balance%TYPE := 10.00;
my_dname scott.dept.dname%TYPE;
dept_rec dept%ROWTYPE;

SELECT deptno, dname, loc INTO dept_rec


FROM dept WHERE deptno = 30;

using record variable to read a row from a table

Oracle Tutorials: PL/SQL


1 June 2006 15
PL/SQL Control Structures
 Conditional Control
 Using IF and CASE statements

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;

 Numeric range WHILE l_i < 10 LOOP


 Reversed DBMS_OUTPUT.PUT_LINE (TO_CHAR(l_i));
l_i := l_i + 1;
 Cursor based END LOOP;

FOR l_i IN 1..500 LOOP


DBMS_OUTPUT.PUT_LINE (TO_CHAR(l_i));
END LOOP;

FOR l_i IN REVERSE 1..3 LOOP


DBMS_OUTPUT.PUT_LINE (TO_CHAR(l_i));
END LOOP;
END;

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

SELECT COUNT(*) INTO variable FROM table;


SELECT * INTO record FROM table WHERE …;

 Selecting Multiple rows:


 Cursors
 Inserting and updating
INSERT INTO table VALUES (var1, var2, …);

Oracle Tutorials: PL/SQL


1 June 2006 19
Cursors

 Every SQL query produces a result set - cursor


 set of rows that answer the query
 resides on the server in the client process memory
 PL/SQL program can read the result set in interating
fashon EMP_NO EMP_NAME EMP_JOB EMP_HIREDATE EMP_DEPTNO

380 KING CLERK 1-JAN-1982 10

select 381 BLAKE ANALYST 11-JAN-1982 30


emp_no 392 CLARK CLERK 1-FEB-1981 30
,emp_name Result Set
569 SMITH CLERK 2-DEC-1980 20
,emp_job 566 JONES MANAGER 5-JUL-1978 30
from employees 788 SCOTT ANALYST 20-JUL-1981 10
where emp_no > 500; 876 ADAMS CLERK 14-MAR-1980 10

902 FORD ANALYST 25-SEP-1978 20

1 June 2006
Oracle Tutorials: PL/SQL 20
Defining explicit cursors
 The simplest cursor:
CURSOR my_cursor IS SELECT * from table;

 Full cursor syntax


CURSOR name(parameter_list) RETURN rowtype IS SELECT …;

 The SQL select statement is static (hardcoded)


 But may be parameterized
 The return type clause is useful in packages
 Attributes
 %FOUND, %NOTFOUND, %ROWCOUNT, %ISOPEN
Oracle Tutorials: PL/SQL
1 June 2006 21
Using explicit cursors
 Fetching results of a query into RECORD

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;

Oracle Tutorials: PL/SQL


1 June 2006 22
Implicit cursor
DECLARE
l_rows number(5);
BEGIN
UPDATE employee SET salary = salary + 1000;
IF SQL%NOTFOUND THEN
dbms_output.put_line('None of the salaries where updated');
ELSIF SQL%FOUND THEN l_rows := SQL%ROWCOUNT;
dbms_output.put_line('Salaries for ' || l_rows || 'employees are
updated');
END IF;
END;

Oracle Tutorials: PL/SQL


1 June 2006 23
Dynamic PL/SQL
 Execution of statement composed in strings
 For SQL which text is unknown at compiling time
 Some parts of SQL cannot be bind by variables
 table name
 database link
…

 Be aware of SQL injections!


 Use dynamic SQL when it is really needed

Oracle Tutorials: PL/SQL


1 June 2006 24
Dynamic SQL & PL/SQL
 Inserting
sql_stmt := 'INSERT INTO payroll VALUES (:x, :x, :y, :x)';
EXECUTE IMMEDIATE sql_stmt USING a, b; -- using variables

 Selecting data from dynamic table_name


EXECUTE IMMEDIATE 'select id form '||table_name||' where name=:a '
using job_name returning into job_id;

 Dynamic PL/SQL
plsql_block := 'BEGIN calc_stats(:x, :x, :y, :x); END;';
EXECUTE IMMEDIATE plsql_block USING a, b;

Oracle Tutorials: PL/SQL


1 June 2006 25
PL/SQL Subprograms
 Named block
 stored in the database
 can have set of parameters
 invocation
 from named block
 from anonymous blocks
 recursively
 Subprogram types
 Procedures
 complex data processing
 Functions
 frequent, simple operations
 returns a value
Oracle Tutorials: PL/SQL
1 June 2006 26
PL/SQL Subprograms

 The header specifies:


 Name and parameter list
 Return type (function headers)
 Parameters:
 Any of them can have a default value
 Parameter input modes:
 IN (default)
 Passes value to that cannot be changed by the subprogram
 OUT
 Return value. Should be initialized in the subprogram
 IN OUT
 Passes a value and returns updated one by subprogram
Oracle Tutorials: PL/SQL
1 June 2006 27
PL/SQL Procedures

 Procedure definition

CREATE OR REPLACE PROCEDURE EXE$RAISE_SALARY (p_emp_id IN NUMBER


, p_amount IN NUMBER) IS
BEGIN
UPDATE employees SET salary = salary + p_amount
WHERE employee_id = p_emp_id;
END EXE$RAISE_SALARY;

 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);

select STF$HALF_OF_SQUARE( a ) from squers;

Oracle Tutorials: PL/SQL


1 June 2006 29
Subprograms privileges
 Creator/owner has full privileges on stored objects
 Invoker that is not an owner has to have EXECUTE
privilege granted
-- USER1

create or replace function my_fuction1 is…


grant execute on my_procedure1 to user2;

-- USER2

execute user1.myprocedure;

 Granted privs can be checked in USER_TAB_PRIVS


Oracle Tutorials: PL/SQL
1 June 2006 30
Subprograms rights
 Definer rights (default for named blocks)
create or replace procedure procedure_name [authid definer]
is…

 Invoker rights
create or replace function procedure_name authid current_user
is…

 Anonymous blocks have always invoker rights!

Oracle Tutorials: PL/SQL


1 June 2006 31
Error Handling
 An error interrupts the execution of the program
 An exception is raised

 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

Oracle Tutorials: PL/SQL


1 June 2006 32
PL/SQL Exceptions
 The programmer can create, name and raise
exception
 Exceptions can by caught and handled by the user’s
code
 Exceptions does not rollback or commit changes!
 Categories
 Internally defined (without name, just error code)
 Predefined (with name and error code)
 User-defined (with name, raised always explicitly)
Oracle Tutorials: PL/SQL
1 June 2006 33
PL/SQL Exceptions

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

Oracle Tutorials: PL/SQL


1 June 2006 35
Why use Packages
 Modularity
 Encapsulation of data and functionality
 Clear specifications independent of the
implementation
 Easier development
 Added functionality:
 global variables
 global types
 Better performance
Oracle Tutorials: PL/SQL
1 June 2006 36
Package Specification

 Header
 Declarations of global types and variables
 Specification of cursors
 With RETURN clause, but no SELECT statement
 Specification of public modules

Oracle Tutorials: PL/SQL


1 June 2006 37
Package Specification

CREATE OR REPLACE PACKAGE KNL_EMP_ADM AS


TYPE T_EMPRECTYP IS RECORD (emp_id NUMBER, sal NUMBER);
CURSOR desc_salary RETURN T_EMPRECTYP ;
invalid_salary EXCEPTION;

PROCEDURE EXE$FIRE_EMPLOYEE (p_emp_id NUMBER);


PROCEDURE EXE$RAISE_SALARY (p_emp_id NUMBER,p_amount NUMBER);
FUNCTION STF$HIGHEST_SALARY (p_n NUMBER) RETURN T_EMPRECTYP;
END KNL_EMP_ADM;

Oracle Tutorials: PL/SQL


1 June 2006 38
Package Body
 Header
 Additional declarations of types and variables
 Specification and SELECT statements of cursors
 Specification and body of modules
 Initialization code
 Execution and exception sections
 Executed once when the package is first accessed

Oracle Tutorials: PL/SQL


1 June 2006 39
Package Body

CREATE OR REPLACE PACKAGE BODY KNL_EMP_ADM AS


number_hired NUMBER;
CURSOR desc_salary RETURN T_EMPRECTYP IS
SELECT employee_id, salary FROM employees ORDER BY salary
DESC;
PROCEDURE EXE$FIRE_EMPLOYEE (p_emp_id NUMBER) IS
BEGIN
DELETE FROM employees WHERE employee_id = p_emp_id;
END EXE$FIRE_EMPLOYEE;
PROCEDURE EXE$RAISE_SALARY (p_emp_id NUMBER,p_amount NUMBER) IS
...
BEGIN
INSERT INTO emp_audit VALUES (SYSDATE, USER, 'EMP_ADMIN');
number_hired := 0;
END;
END KNL_EMP_ADM; Oracle Tutorials: PL/SQL
1 June 2006 40
Oracle Supplied Packages

 Extend the functionality of the database


 Some example packages:
 DBMS_JOB: for task scheduling

 DBMS_PIPE: for communication between sessions

 DBMS_OUTPUT: display messages to the session output

device
 UTL_HTTP: makes HTTP callouts.

 Many others…

Oracle Tutorials: PL/SQL


1 June 2006 41
Triggers
 Stored procedure
 Execute automatically when:
 data modification (DML Trigger)
 INSERT, UPDATE, UPDATE column or DELETE
 schema modification (DDL Trigger)
 system event, user logon/logoff (System Trigger)
 Basic DML triggers types:
 BEFORE statement
 BEFORE each row modification
 AFTER each row modification
 AFTER statement
 INSTEAD OF - to enable data modification by views
Oracle Tutorials: PL/SQL
1 June 2006 42
When To Use Triggers
 Automatic data generation
 Auditing (logging), statistics
 Derived data
 Data replication
 Special referential constrains
 Complex logic
 Distributed constrains
 Time based constrains
 Updates of complex views
 Triggers may introduce hard to spot
interdependencies to the database schema
Oracle Tutorials: PL/SQL
1 June 2006 43
Trigger Body
 Built like a PL/SQL procedure
 Additionally:
 Type of the triggering event can be determined inside
the trigger using conditional predicators
IF inserting THEN … END IF;
 Old and new row values are accessible via :old
and :new qualifiers (record type variables)

Oracle Tutorials: PL/SQL


1 June 2006 44
Trigger Example

CREATE OR REPLACE TRIGGER audit_sal


BEFORE UPDATE OF salary ON employees
FOR EACH ROW
BEGIN
INSERT INTO emp_audit
VALUES( :old.employee_id, SYSDATE, :new.salary, :old.salary );
COMMIT;
END;

Oracle Tutorials: PL/SQL


1 June 2006 45
Jobs
 Job
 Schedule
 PL/SQL subprogram (but not only)
 Many possibilities for the scheduling
 Creation
 Using DBMS_SCHEDULER internal package
 Alternative DBMS_JOB is old and should by avoided
 Privileges needed
 execute on DBMS_SCHEDULER
 create job

Oracle Tutorials: PL/SQL


1 June 2006 46
Jobs example
 Daily execution (everyday at 12) of
my_saved_procedure

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;
/

Oracle Tutorials: PL/SQL


1 June 2006 47
Advantages of PL/SQL
 Tightly integrated with SQL
 Reduced network traffic
 Portability - easy deployment and distribution
 Data layer separated from client language
 Modification without changing of application code
 Can be shared by many platform
 Server-side periodical data maintenance (jobs)

Oracle Tutorials: PL/SQL


1 June 2006 48

You might also like