0% found this document useful (0 votes)
42 views

PL SQL Final

Uploaded by

navneetccna
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
42 views

PL SQL Final

Uploaded by

navneetccna
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 29

1

An Introduction to
PL/SQL
Mehdi Azarmi
2

Introduction
• PL/SQL is Oracle's procedural language extension to
SQL, the non-procedural relational database language.
• Combines power and flexibility of SQL (4GL) with
procedural constructs of a 3GL
• Extends SQL by adding
• Variables and types
• Control Structures (conditional, loops)
• Procedures and functions
• Exception handling
•…
3

Block Definition
• Basic unit of PL/SQL is a block
• Three possible sections of a block
• Declarative section
• Executable section
• Exception handling
• A block performs a logical unit of work in the program
• Blocks can be nested
4

Block Structure
DECLARE

/* Declarative section: variables, types, and local


subprograms. */

BEGIN

/* Executable section: procedural and SQL statements go here.


*/
/* This is the only section of the block that is required. */

EXCEPTION

/* Exception handling section: error handling statements go


here. */

END;
5

Executable Section
• The only required section

• Contains constructs such as assignments, branches, loops,


procedure calls, and triggers

• SELECT, INSERT, UPDATE, DELETE are supported


• the SELECT statement has a special form in which a single tuple is placed in
variables

• Data definition statements like CREATE, DROP, or ALTER are not


allowed.

• PL/SQL is not case sensitive. C style comments (/* ... */) may be
used.
6

Variables and Types


• Declared in the declaration section
• Variables have a specific type associated with them
• Types
• One of the types used by SQL for database columns
• A generic type used in PL/SQL
• Most useful is NUMBER (can hold either an integer or a real number)
• BOOLEAN (but not supported as a type for database columns)
• Declared to be the same as the type of some database column
• It is essential that the variable have the same type as the
relation column.
• use the %TYPE operator
DECLARE
myBeer Beers.name%TYPE;
• A variable may also have a type that is a record with several fields
beerTuple Beers%ROWTYPE; /* (name, manufacture)*/
7

Variables - Example

DECLARE
a NUMBER := 3;
BEGIN
a := a + 1;
END;
.
To execute the program
run;

• The initial value of any variable, regardless of its type, is NULL.


• This program has no effect when run, because there are no
changes to the database.
8

Example
CREATE TABLE T1(
e INTEGER,
f INTEGER • There is only one tuple of T1 that has
);
first component greater than 1, (2,4).
DELETE FROM T1; Therefore, INSERT statement inserts
INSERT INTO T1 VALUES(1, 3); (4,2) into T1.
INSERT INTO T1 VALUES(2, 4);

/* Above is plain SQL; below is the PL/SQL • The SELECT statement in PL/SQL
program. */
only works if the result of the query
DECLARE
contains a single tuple
a NUMBER;
b NUMBER;
• If the query returns more than one
BEGIN
SELECT e,f INTO a,b FROM T1 WHERE e>1; tuple, you need to use a cursor
INSERT INTO T1 VALUES(b,a);
END;
.
run;
9

Control flow in
PL/SQL
10

IF Statement
• An IF statement looks like:
IF <condition>
THEN <statement_list>
ELSE <statement_list>
END IF;
• The ELSE part is optional
• If you want a multiway branch, use:
IF <condition_1> THEN …
ELSIF <condition_2> THEN …
...
ELSIF <condition_n> THEN …
ELSE …
END IF;
11

IF - Example
DECLARE
a NUMBER;
b NUMBER;
BEGIN
SELECT e,f INTO a,b FROM T1 WHERE e>1;
IF b=1 THEN
INSERT INTO T1 VALUES(b,a);
ELSE
INSERT INTO T1 VALUES(b+10,a+10);
END IF;
END;
.
run;
12

IF - Example 2
IF TotalStudents = 0 THEN
DECLARE
INSERT INTO temp_table (char_col)
TotalStudents NUMBER; VALUES ('There are no students
registered');
BEGIN ELSIF TotalStudents < 5 THEN
INSERT INTO temp_table (char_col)
SELECT COUNT(*)
VALUES ('There are only a few students
INTO TotalStudents registered');
ELSIF TotalStudents < 10 THEN
FROM students; INSERT INTO temp_table (char_col)
VALUES ('There are a little more
… students registered');
ELSE
INSERT INTO temp_table (char_col)
VALUES ('There are many students
registered');
END IF;
END;
/
13

IF and UPDATE - Example


DECLARE
NewMajor VARCHAR2(10) := ’CS';
FirstName VARCHAR2(10) := ’Mehdi';
LastName VARCHAR2(10) := ’Azarmi';
BEGIN
UPDATE students
SET major = NewMajor
WHERE first_name = FirstName
AND last_name = LastName;
IF SQL%NOTFOUND THEN
INSERT INTO students (ID, first_name, last_name, major)
VALUES (student_sequence.NEXTVAL, FirstName, LastName, NewMajor);
END IF;
END;
/
14

Loops
• A loop allows execution of a set of statements repeatedly
• Types of loops
• Simple loop
• Numeric For loop
• While loop
• Loops are created with the following:
LOOP
<loop_body> /* A list of statements. */
END LOOP;
• At least one of the statements in <loop_body> should be
an EXIT statement of the form
• EXIT WHEN <condition>;
15

LOOP - Example
DECLARE
i NUMBER := 1;
BEGIN
LOOP
INSERT INTO T1 VALUES(i,i);
i := i+1;
EXIT WHEN i>100;
END LOOP;
END;
.
run;
16

FOR and WHILE Loops


• A WHILE loop can be formed with
WHILE <condition> LOOP
<loop_body>
END LOOP;
• A simple FOR loop can be formed with:
FOR <var> IN <start>..<finish> LOOP
<loop_body>
END LOOP;
• Here, <var> can be any variable; it is local to the for-loop
and need not be declared. Also, <start> and <finish> are
constants.
17

FOR - Example
BEGIN
FOR LoopCounter IN 1..50 LOOP
INSERT INTO temp_table (num_col)
VALUES (LoopCounter);
END LOOP;
END;
/
18

Cursors
• the SELECT statement in PL/SQL only works if the result
of the query contains a single tuple
• If the query returns more than one tuple, or you want to
manipulate a relation with more than one row, you need to
use a cursor
• A cursor creates a named context area as a result of
executing an associated SQL statement
• Permits the program to step through the multiple rows
displayed by an SQL statement
19

CURSOR – Example part1


1) DECLARE
/* Output variables to hold the result of the query: */
2) a T1.e%TYPE;
3) b T1.f%TYPE;
/* Cursor declaration: */
4) CURSOR T1Cursor IS
5) SELECT e, f
6) FROM T1
7) WHERE e < f
8) FOR UPDATE;
9) BEGIN
10) OPEN T1Cursor;

… Next page
20

CURSOR– Example part2


11) LOOP
/* Retrieve each row of the result of the above query
into PL/SQL variables: */
12) FETCH T1Cursor INTO a, b;
/* If there are no more rows to fetch, exit the loop: */
13) EXIT WHEN T1Cursor%NOTFOUND;
/* Delete the current tuple: */
14) DELETE FROM T1 WHERE CURRENT OF T1Cursor;
/* Insert the reverse tuple: */
15) INSERT INTO T1 VALUES(b, a);
16) END LOOP;
/* Free cursor used by the query. */
17) CLOSE T1Cursor;
18) END;
19) .
20) run;
21

Procedure
• PROCEDURE and FUNCTIONS
• Parameters
• Mode of operation:
• IN (read-only)
• OUT (write-only)
• INOUT (read and write)
• Type
• the type specifier in a parameter declaration must be
unconstrained.
• Example: CHAR(10) and VARCHAR(20) are illegal
• CHAR or VARCHAR should be used instead.
22

PROCEDURE - Template
CREATE OR REPLACE PROCEDURE PROCNAME(PARAMETERS) AS
<local_var_declarations>

BEGIN
<procedure_body>
END;
.
run;

• The run at the end runs the statement that creates the procedure; it does not
execute the procedure.
• To execute the procedure, use another PL/SQL statement, in which the
procedure is invoked as an executable statement.
• For example:
BEGIN addtuple1(99); END;
.
Run;
23

PROCEDURE – Example 1
CREATE TABLE T2 (
a INTEGER,
b CHAR(10)
);

CREATE PROCEDURE addtuple2(


x IN T2.a%TYPE,
y IN T2.b%TYPE)
AS

BEGIN
INSERT INTO T2(a, b)
VALUES(x, y);
END addtuple2;
.
run;

• Now, to add a tuple (10, 'abc') to T2:


BEGIN
addtuple2(10, 'abc');
END;
.
run;
24

PROCEDURE – Example 2
CREATE TABLE T3 (
a INTEGER,
b INTEGER
);

CREATE PROCEDURE addtuple3(a NUMBER, b OUT NUMBER)


AS
BEGIN
b := 4;
INSERT INTO T3 VALUES(a, b);
END;
.
Run;

DECLARE
v NUMBER;
BEGIN
addtuple3(10, v); /* second parameter should be an lvalue*/
END;
.
run;
25

PROCEDURE – Final Notes


• We can also write functions instead of procedures. In a function
declaration, we follow the parameter list by RETURN and the type of
the return value:
• CREATE FUNCTION <func_name>(<param_list>) RETURN
<return_type> AS ...
• In the body of the function definition, "RETURN <expression>;" exits from the
function and returns the value of <expression>.
• To find out what procedures and functions you have created, use the
following SQL query:
select object_type, object_name
from user_objects
where object_type = 'PROCEDURE’ or object_type = 'FUNCTION’;
• To drop a stored procedure/function:
drop procedure <procedure_name>;
drop function <function_name>;
26

Printing
• Always use the following line (setting output buffer) at the
beginning of your SQL file:
set serveroutput on size 32000
• Printing a line:
dbms_output.put_line(VAR1|| '. ' || VAR2);
• You may declare and use a bind variable to print a local variable
VARIABLE x NUMBER
BEGIN
:x := 1;
END;
.
run;

PRINT :x;
27

Debugging
• PL/SQL does not always tell you about compilation errors.
Instead, it gives you a cryptic message such as:
"procedure created with compilation errors".
• If you don't see what is wrong immediately, try issuing the
command
show errors procedure <procedure_name>;
• Alternatively, you can type, SHO ERR (short for SHOW
ERRORS) to see the most recent compilation error.
• Note that the location of the error given as part of the
error message is not always accurate!
28

Performance of PL/SQL
• SQL results in many network trips, one for each SQL
statement
• PL/SQL permits several SQL statements to be bundled
into a single block
• Results in fewer calls to database
• Less network traffic
• faster response time
29

References
• http://infolab.stanford.edu/~ullman/fcdb/oracle/or-
plsql.html
• Oracle PL/SQL Programming: Covers Versions Through
Oracle Database 11g Release 2, by Steven Feuerstein
and Bill Pribyl (Oct 1, 2009)

You might also like