Top Banner
Programming in Oracle with PL/SQL Procedural Language Extension to SQL
64

Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Feb 08, 2018

Download

Documents

dangnhu
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Programming in Oracle

with PL/SQL

Procedural Language Extension to SQL

Page 2: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Overview

Overview of PL/SQL

Data type and Variables

Program Structures

Triggers

Database Access Using Cursors

Records

PL/SQL Tables

Built-in Packages

Error-Handling

PL/SQL Access to Oracle 10g Objects

CA105: RDBMS Gauravkumarsingh Gaharwar

2

Page 3: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

PL/SQL

Allows using general programming tools with SQL, for example: loops, conditions, functions, etc.

This allows a lot more freedom than general SQL, and is lighter-weight than JDBC.

We write PL/SQL code in a regular file, for example PL.sql, and load it with @PL in the sqlplus console.

CA105: RDBMS Gauravkumarsingh Gaharwar

3

Page 4: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Other Databases

All have procedural facilities

SQL is not functionally complete

Lacks full facilities of a programming language

So top up functionality by embedding SQL in a procedural language

PL/SQL techniques are specific to Oracle

but procedures and functions can be ported to other systems

CA105: RDBMS Gauravkumarsingh Gaharwar

4

Page 5: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Why use PL/SQL Manage business rules – through middle layer application logic.

Generate code for triggers

Generate code for interface

Enable database-centric client/server applications

CA105: RDBMS Gauravkumarsingh Gaharwar

5

Page 6: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Using PL/SQL as a programming languagePermits all operations of standard

programming languages e.g.

Conditions IF-THEN-ELSE-END IF;

Jumps GOTO

Provides loops for controlling iteration

LOOP-EXIT; WHEN-END LOOP; FOR-END LOOP; WHILE-END LOOP

Allows extraction of data into variables and its subsequent manipulation

CA105: RDBMS Gauravkumarsingh Gaharwar

6

Page 7: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Overview

Overview of PL/SQL

Data type and Variables

Program Structures

Triggers

Database Access Using Cursors

Records

PL/SQL Tables

Built-in Packages

Error-Handling

PL/SQL Access to Oracle 10g Objects

CA105: RDBMS Gauravkumarsingh Gaharwar

7

Page 8: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Use of Data-Types

Number – used to store any number

Char(size) & varchar2(size) e.g.: char(10) – used to store alphanumerical text strings, the char data type will pad the value stored to the full length declared.

Date – used to store datesLong – used to store large blocks of text

up to 2 gigabytes in length (limited operations)

<variable-name> <datatype> [not null][: =<initial-value>];

<constant-name> constant <datatype> : = <value>];

CA105: RDBMS Gauravkumarsingh Gaharwar

8

Page 9: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

More data-types Long raw – stores large blocks of data stored in binary format

Raw – stores smaller blocks of data in binary formal

Rowid – used to store the special format of rowid’s on the

database

CA105: RDBMS Gauravkumarsingh Gaharwar

9

Page 10: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Variable and constant

declaration

<variable-name> <datatype> [not null][: =<initial-value>];

<constant-name> constant <datatype> [: = <value>];

CA105: RDBMS Gauravkumarsingh Gaharwar

10

Page 11: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Anchored Data Type

Variables can also be declared to have anchored data types

Data types are determined by looking up another object’s data type.

This another data type could be a column in the database, thereby providing the ability to match the data types of PL/SQL variables with the data types of columns defined in the database.

<variable-name> <object> %type [not null][: =<initial-value>];

CA105: RDBMS Gauravkumarsingh Gaharwar

11

Page 12: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Anchored Data Type

Example

Record.element notation will address components of tuples (dot

notation)

<variable-name> <object> %type [not null][: =<initial-value>];

commission real(5,2) := 12.5

X commission%type;

Cname employee.empname%type;

Empid empname addr1 addr2 addr3 postcode grade salary

employee

CA105: RDBMS Gauravkumarsingh Gaharwar

12

Page 13: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Anchored Data Type Example

Select values into PL/SQL variables

using INTO %rowtype allows full rows to be selected into one variable

Empid empname addr1 addr2 addr3 postcode grade salary

V_employee employee%rowtype

CA105: RDBMS Gauravkumarsingh Gaharwar

13

Page 14: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Anchored Data Type Example

Selects entire row of data into 1 variable called v_employee

Is updating the value of salary based on selected element of a variable

p1.sql

CA105: RDBMS Gauravkumarsingh Gaharwar

14

Page 15: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Overview

Overview of PL/SQL

Data type and Variables

Program Structures

Triggers

Database Access Using Cursors

Records

PL/SQL Tables

Built-in Packages

Error-Handling

PL/SQL Access to Oracle 10g Objects

CA105: RDBMS Gauravkumarsingh Gaharwar

15

Page 16: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Program Structures: Procedures and

Functions A set of SQL and PL/SQL statements grouped

together as a unit (block) to solve a specific problem or perform a set of related tasks.

An anonymous block is a PL/SQL block that appears within your application and it is not named or stored in the database. In many applications, PL/SQL blocks can appear wherever SQL statements can appear.

A stored procedure is a PL/SQL block that Oracle stores in the database and can be called by name from an application. May or may not return a value.

Functions always return a single value to the caller; procedures do not return values to the caller.

Packages are groups of procedures and functions.

CA105: RDBMS Gauravkumarsingh Gaharwar

16

Page 17: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

PL/SQL Blocks

PL/SQL code is built of Blocks, with a

unique structure.

Anonymous Blocks: have no name (like

scripts)

can be written and executed immediately in SQLPLUS

can be used in a trigger

CA105: RDBMS Gauravkumarsingh Gaharwar

17

Page 18: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Anonymous Block StructureDECLARE (optional)

/* Here you declare the variables you will use in this block */

BEGIN (mandatory)

/* Here you define the executable statements (what the block DOES!)*/

EXCEPTION (optional)

/* Here you define the actions that take place if an exception is thrown during the run of this block */

END; (mandatory)

/Always put a new line with only a

/ at the end of a block! (This

tells Oracle to run the block)

A correct completion of a block will generate the following message:

PL/SQL procedure successfully completed

CA105: RDBMS Gauravkumarsingh Gaharwar

18

Page 19: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Anonymous Blocks

Gets all the rows from customers table and prints the names of the customers on the screen. It uses tables and cursors.

customers

cursor c

c-rec (row of c)

c_table

SQL> start p2.sql

CA105: RDBMS Gauravkumarsingh Gaharwar

19

Page 20: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

DECLARE

Syntax

Examples

identifier [CONSTANT] datatype [NOT NULL]

[:= | DEFAULT expr];

Declare

birthday DATE;

age NUMBER(2) NOT NULL := 27;

name VARCHAR2(13) := 'Levi';

magic CONSTANT NUMBER := 77;

valid BOOLEAN NOT NULL := TRUE;

Notice that PL/SQL includes all SQL types, and more…

CA105: RDBMS Gauravkumarsingh Gaharwar

20

Page 21: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Declaring Variables with the

%TYPE Attribute

Examples

DECLARE

sname Sailors.sname%TYPE;

fav_boat VARCHAR2(30);

my_fav_boat fav_boat%TYPE := 'Pinta';

...

Accessing column sname in table Sailors

Accessing another variable

CA105: RDBMS Gauravkumarsingh Gaharwar

21

Page 22: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Declaring Variables with the

%ROWTYPE Attribute

Declare a variable with the type

of a ROW of a table.

And how do we access the fields

in reserves_record?

reserves_record Reserves%ROWTYPE;

reserves_record.sid:=9;

Reserves_record.bid:=877;

Accessing table Reserves

CA105: RDBMS Gauravkumarsingh Gaharwar

22

Page 23: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Creating a PL/SQL Record

A record is a type of variable which we can

define (like ‘struct’ in C or ‘object’ in Java)

DECLARE

TYPE sailor_record_type IS RECORD

(sname VARCHAR2(10),

sid VARCHAR2(9),

age NUMBER(3),

rating NUMBER(3));

sailor_record sailor_record_type;

...

BEGIN

Sailor_record.sname:=‘peter’;Sailor_record.age:=45;

… CA105: RDBMS Gauravkumarsingh Gaharwar

23

Page 24: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Creating a Cursor

We create a Cursor when we want to go over a result of a query (like ResultSet in JDBC)

Syntax Example:

DECLAREcursor c is select * from sailors;

sailorData sailors%ROWTYPE;

BEGIN

open c;fetch c into sailorData;

sailorData is a variable that can hold a ROW from the sailors table

Here the first row of sailors is inserted into sailorData

CA105: RDBMS Gauravkumarsingh Gaharwar

24

Page 25: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

SELECT Statements

INTO clause is required.

Query must return exactly one row.

Otherwise, a NO_DATA_FOUND or

TOO_MANY_ROWS exception is thrown

DECLARE

v_sname VARCHAR2(10);

v_rating NUMBER(3);

BEGIN

SELECT sname, rating

INTO v_sname, v_rating

FROM Sailors

WHERE sid = '112';

END;

/

CA105: RDBMS Gauravkumarsingh Gaharwar

25

Page 26: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Conditional logic

If <cond>

then <command>

elsif <cond2>

then <command2>

else

<command3>

end if;

If <cond>

then

if <cond2>

then

<command1>

end if;

else <command2>

end if;

Condition: Nested conditions:

CA105: RDBMS Gauravkumarsingh Gaharwar

26

Page 27: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

IF-THEN-ELSIF Statements

. . .

IF rating > 7 THEN

v_message := 'You are great';

ELSIF rating >= 5 THEN

v_message := 'Not bad';

ELSE

v_message := 'Pretty bad';

END IF;

. . .

CA105: RDBMS Gauravkumarsingh Gaharwar

27

Page 28: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Suppose we have the following table:

• Want to keep track of how many times someone logged on to the DB

• When running, if user is already in table, increment logon_num. Otherwise, insert user into table

logon_numwho

3Peter

4John

2Moshe

create table mylog(

who varchar2(30),

logon_num number

);

mylog

CA105: RDBMS Gauravkumarsingh Gaharwar

28

Page 29: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Solution

DECLAREcnt NUMBER;

BEGINselect logon_numinto cnt //variable store current logon numsfrom mylogwhere who = user;//func returns current user name

if cnt > 0 thenupdate mylogset logon_num = logon_num + 1

where who = user;else insert into mylog values(user, 1);

end if;commit;

end;/ CA105: RDBMS Gauravkumarsingh Gaharwar

29

Page 30: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

SQL%ROWCOUNT Number of rows affected by the most recent SQL statement (an integer value).

SQL%FOUND Boolean attribute that evaluates to TRUE if the most recent SQL statement affects one or more rows.

SQL%NOTFOUND Boolean attribute that evaluates to TRUE if the most recent SQLstatement does not affect any rows.

SQL%ISOPEN Always evaluates to FALSE because PL/SQL closes implicit cursorsimmediately after they are executed.

SQL Cursor

SQL cursor is automatically created after each SQL query. It has 4 useful

attributes:

CA105: RDBMS Gauravkumarsingh Gaharwar

30

Page 31: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Solution (2)

BEGINupdate mylogset logon_num = logon_num + 1where who = user;

if SQL%ROWCOUNT = 0 theninsert into mylog values(user, 1);

end if;commit;END;/

CA105: RDBMS Gauravkumarsingh Gaharwar

31

Page 32: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Loops: Simple Loop

DECLARE

i number_table.num%TYPE := 1;

BEGIN

LOOP

INSERT INTO number_table

VALUES(i);

i := i + 1;

EXIT WHEN i > 10;

END LOOP;

END;

create table number_table(

num NUMBER(10)

);

CA105: RDBMS Gauravkumarsingh Gaharwar

32

Page 33: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Loops: Simple Cursor Loop

DECLARE

cursor c is select * from number_table;

cVal c%ROWTYPE;

BEGIN

open c;

LOOP

fetch c into cVal;

EXIT WHEN c%NOTFOUND;

insert into number_table values(cVal.num*2);

END LOOP;

END;

create table number_table(

num NUMBER(10)

);

CA105: RDBMS Gauravkumarsingh Gaharwar

33

Page 34: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Loops: FOR Loop

DECLARE

i number_table.num%TYPE;

BEGIN

FOR i IN 1..10 LOOP

INSERT INTO number_table VALUES(i);

END LOOP;

END;

Notice that i is incremented automatically

CA105: RDBMS Gauravkumarsingh Gaharwar

34

Page 35: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Loops: For Cursor Loops

DECLARE

cursor c is select * from number_table;

BEGIN

for num_row in c loop

insert into doubles_table

values(num_row.num*2);

end loop;

END;

/

Notice that a lot is being done implicitly: declaration of num_row, open cursor, fetch cursor, the exit condition (refer to slide 19 for details)

CA105: RDBMS Gauravkumarsingh Gaharwar

35

Page 36: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Loops: WHILE Loop

DECLARE

TEN number:=10;

i number_table.num%TYPE:=1;

BEGIN

WHILE i <= TEN LOOP

INSERT INTO number_table VALUES(i);

i := i + 1;

END LOOP;

END;

CA105: RDBMS Gauravkumarsingh Gaharwar

36

Page 37: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Printing Output

You need to use a function in the

DBMS_OUTPUT package in order to print to

the output

If you want to see the output on the screen,

you must type the following (before starting):

set serveroutput on format wrapped size 1000000

Then print using

dbms_output. put_line(your_string);

dbms_output.put(your_string);CA105: RDBMS Gauravkumarsingh Gaharwar

37

Page 38: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Input and output example

set serveroutput on format wrap size 1000000

ACCEPT high PROMPT 'Enter a number: '

DECLARE

i number_table.num%TYPE:=1;

BEGIN

dbms_output.put_line('Look, I can print from PL/SQL!!!');

WHILE i <= &high LOOP

INSERT INTO number_table

VALUES(i);

i := i + 1;

END LOOP;

END;CA105: RDBMS Gauravkumarsingh Gaharwar

38

Page 39: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Reminder- structure of a

block

DECLARE (optional)/* Here you declare the variables you will

use in this block */

BEGIN (mandatory)/* Here you define the executable

statements (what the block DOES!)*/

EXCEPTION (optional)/* Here you define the actions that take

place if an exception is thrown during the run of this block */

END; (mandatory)/

CA105: RDBMS Gauravkumarsingh Gaharwar

39

Page 40: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Functions and Procedures

CA105: RDBMS Gauravkumarsingh Gaharwar

40

Page 41: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Functions and Procedures

It is useful to put code in a function or procedure so it

can be called several times

Once we create a procedure or function in a

Database, it will remain until deleted (like a table).

CA105: RDBMS Gauravkumarsingh Gaharwar

41

Page 42: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

CREATE [OR REPLACE] PROCEDURE procedure_name

[(parameter1 [mode1] datatype1,

parameter2 [mode2] datatype2,

. . .)]

IS|AS

PL/SQL Block;

Creating Procedures

Modes:

IN: procedure must be called with a value for the parameter. Value cannot be changed

OUT: procedure must be called with a variable for the parameter. Changes to the parameter are seen by the user (i.e., call by reference)

IN OUT: value can be sent, and changes to the parameter are seen by the user

Default Mode is: INCA105: RDBMS Gauravkumarsingh Gaharwar

42

Page 43: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Procedures

Creation command

Variable declarations

Body of code

Create or replace procedure sample1 as

v_num1 constant number := 2.5;

v_num2 constant number := 4;

v_product number;

BEGIN

v_product := v_num1 * v_num2;

END;

CA105: RDBMS Gauravkumarsingh Gaharwar

43

Page 44: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

create or replace procedure

num_logged

(person IN mylog.who%TYPE,

num OUT mylog.logon_num%TYPE)

IS

BEGIN

select logon_num

into num

from mylog

where who = person;

END;

/

Example- what does this do?

logon_

numwho

3Pete

4John

2Joe

Table mylog

CA105: RDBMS Gauravkumarsingh Gaharwar

44

Page 45: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

declare

howmany mylog.logon_num%TYPE;

begin

num_logged(‘John',howmany);

dbms_output.put_line(howmany);

end;

/

Calling the Procedure

More procedures: p3.sql

CA105: RDBMS Gauravkumarsingh Gaharwar

45

Page 46: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Errors in a Procedure

When creating the procedure, if there are errors in its definition, they will not be shown

To see the errors of a procedure called myProcedure, type

SHOW ERRORS PROCEDURE myProcedure

in the SQLPLUS prompt

For functions, type

SHOW ERRORS FUNCTION myFunction

CA105: RDBMS Gauravkumarsingh Gaharwar

46

Page 47: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Creating a Function

Almost exactly like creating a procedure, but you supply a return type

CREATE [OR REPLACE] FUNCTION

function_name

[(parameter1 [mode1] datatype1,

parameter2 [mode2] datatype2,

. . .)]

RETURN datatype

IS|AS

PL/SQL Block;

CA105: RDBMS Gauravkumarsingh Gaharwar

47

Page 48: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

create or replace function

rating_message(rating IN NUMBER)

return VARCHAR2

AS

BEGIN

IF rating > 7 THEN

return 'You are great';

ELSIF rating >= 5 THEN

return 'Not bad';

ELSE

return 'Pretty bad';

END IF;

END;

/

A Function

NOTE THAT YOU DON'T SPECIFY

THE SIZE

CA105: RDBMS Gauravkumarsingh Gaharwar

48

Page 49: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

declare

paulRate:=9;

Begin

dbms_output.put_line(ratingMessage(paulRate));

end;

/

Calling the function

More functions: p4.sql

CA105: RDBMS Gauravkumarsingh Gaharwar

49

Page 50: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

create or replace function squareFunc(num in number)

return number

is

BEGIN

return num*num;

End;

/

BEGIN

dbms_output.put_line(squareFunc(3.5));

END;

/

Creating a function:

Using the function:

CA105: RDBMS Gauravkumarsingh Gaharwar

50

Page 51: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Stored Procedures and

Functions

The procedures and functions we discussed were called from within the executable section of the anonymous block.

It is possible to store the procedure or function definition in the database and have it invoked from various of environments.

This feature allows for sharing of PL/SQL code by different applications running in different places.

CA105: RDBMS Gauravkumarsingh Gaharwar

51

Page 52: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Stored Procedures

Created in a user's schema and stored centrally, in compiled form in the database as a named object that can be: interactively executed by a user

using a tool like SQL*Plus

called explicitly in the code of a database application, such as an Oracle Forms or a Pre compiler application, or in the code of another procedure or trigger

When PL/SQL is stored in the database, applications can send blocks of PL/SQL to the database rather than individual SQL statements reducing network traffic. .

Program code

.

.

Program code

.

HIRE_EMP(…);

.

Program code

Program code

.

.

Program code

.

HIRE_EMP(…);

.

Program code

Program code

.

.

Program code

.

HIRE_EMP(…);

.

Program code HIRE_EMP(…)

BEGIN

.

.

END;

Database Applications

Stored

Procedure

Database

CA105: RDBMS Gauravkumarsingh Gaharwar

52

Page 53: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Stored Procedures and

Functions

AS keyword means stored procedure/function

IS keyword means part of anonymous block

So does stored function

CREATE [OR REPLACE] PROCEDURE procedure_name

[(parameter1 [mode1] datatype1,

parameter2 [mode2] datatype2,

. . .)]

AS

PL/SQL Block;

CA105: RDBMS Gauravkumarsingh Gaharwar

53

Page 54: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Stored function: p5.sql

get_city function returns city name given customer number.

customers(cno, cname, zip) zipcodes(cnum, zip, city)

SQL>SELECT CNO, CNAME, get_city(cno)

2 from customers;

CNO CNAME GET_CITY(CNO)

------ --------- --------------------

1111 Charles Wichita

2222 Bertram Wichita

Call Stored function

CA105: RDBMS Gauravkumarsingh Gaharwar

54

Page 55: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Benefits of Stored

Procedures I Security

Control data access through procedures and functions.

E.g. grant users access to a procedure that updates a table, but not grant them access to the table itself.

PerformanceThe information is sent only once between database and

application and thereafter invoked when it is used.

Network traffic is reduced compared with issuing individual SQL statements or sending the text of an entire PL/SQL block

A procedure's compiled form is readily available in the database, so no compilation is required at execution time.

The procedure might be cached CA105: RDBMS Gauravkumarsingh Gaharwar

55

Page 56: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Benefits of Procedures II

Memory Allocation Stored procedures take advantage of the shared memory

capabilities of Oracle

Only a single copy of the procedure needs to be loaded into memory for execution by multiple users.

Productivity By designing applications around a common set of

procedures, you can avoid redundant coding and increase your productivity.

Procedures can be written to insert, update, or delete rows from a table and then called by any application without rewriting the SQL statements necessary to accomplish these tasks.

If the methods of data management change, only the procedures need to be modified, not all of the applications that use the procedures. CA105: RDBMS Gauravkumarsingh Gaharwar

56

Page 57: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Benefits of Procedures III

Integrity

Stored procedures improve the integrity and consistency of your applications. By developing all of your applications around a common group of procedures, you can reduce the likelihood of committing coding errors.

You can test a procedure or function to guarantee that it returns an accurate result and, once it is verified, reuseit in any number of applications without testing it again.

If the data structures referenced by the procedure are altered in any way, only the procedure needs to be recompiled; applications that call the procedure do not necessarily require any modifications.

CA105: RDBMS Gauravkumarsingh Gaharwar

57

Page 58: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Packages

collection of procedures and

function

In a package, you can allow some

of the members to be "public" and

some to be "private"

There are also many predefined

Oracle packages

CA105: RDBMS Gauravkumarsingh Gaharwar

58

Page 59: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Packages Example

A package called process_orders in p6.sql

Contains three procedures

add_order takes user input and insert a new row to orderstable.

add_order_details receives input and add a new row to odetails table.

ship_order updates shipped value for the order.

Execute procedures in the package:

SQL> execute process_orders.add_order(2000,111,1000,null);

SQL> execute process_orders.add_order_details(2000,10509,50) ;

SQL> execute process_orders.ship_order(2000,10509,50);CA105: RDBMS Gauravkumarsingh Gaharwar

59

Page 60: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Triggers

PL/SQL code executed automatically in response to a database event, typically DML.

Like other stored procedures, triggers are stored in the database.

Often used to:

enforce complex constraints, especially multi-table constraints. Financial posting is an example of this.

Trigger related actions

implement auditing “logs”

pop a sequence when creating token keys

Triggers do not issue transaction control statements (such as commit). Triggers are part of the SQL transaction that invoked them.

USER_TRIGGERS provides a data dictionary view of triggers.

CA105: RDBMS Gauravkumarsingh Gaharwar

60

Page 61: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Triggers

CREATE OR REPLACE TRIGGER <trigger_name>

[BEFORE/AFTER][DELETE/INSERT/UPDATE of <column_name |, column_name…

|>

ON <table_name>

|FOR EACH ROW|

|WHEN <triggering condition>|

|DECLARE|

BEGIN

trigger statements

…………

END;

To delete a trigger use:

DROP TRIGGER <trigger_name>;

CA105: RDBMS Gauravkumarsingh Gaharwar

61

Page 62: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Log Trigger ExampleCREATE OR REPLACE TRIGGER LOGSTUDENTCHANGES

BEFORE INSERT OR DELETE OR UPDATE of Major ON STUDENTS

FOR EACH ROW

DECLARE

v_ChangeType CHAR(1);

v_sid varchar2(10);

BEGIN

IF INSERTING THEN

V_ChangeType := 'I';

v_sid := :new.sid;

ELSIF UPDATING THEN

V_ChangeType := 'U';

v_sid := :new.sid;

ELSE

V_ChangeType := 'D';

v_sid := :old.sid;

END IF;

INSERT INTO MAJ_AUDIT (change_type, changed_by, timestamp,

SID, old_major, new_major)

VALUES (v_ChangeType, USER, SYSDATE, v_sid, :old.major, :new.major);

END LOGSTUDENTCHANGES;

CA105: RDBMS Gauravkumarsingh Gaharwar

62

Page 63: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

UpperCase Trigger Example

CREATE OR REPLACE TRIGGER UPPERCASE

BEFORE INSERT OR UPDATE ON STUDENTS

FOR EACH ROW

DECLARE

BEGIN

:new.lastname:=UPPER(:new.lastname);

:new.firstname:=UPPER(:new.firstname);

END UPPERCASE;

/

CA105: RDBMS Gauravkumarsingh Gaharwar

63

Page 64: Programming in Oracle with PL/SQL · PDF fileProgramming in Oracle with PL/SQL ... applications, PL/SQL blocks can appear wherever SQL statements can appear. ... scripts) can be written

Ben & Jerry Trigger Example(no employee can make more than 10 times as much as the lowest paid

employee)CREATE OR REPLACE TRIGGER SalaryTrig

BEFORE INSERT ON Employees

FOR EACH ROW

DECLARE

v_upper_sal_limit NUMBER(10,2);

v_lower_sal_limit NUMBER(10,2);

BEGIN

SELECT MIN(salary)*10 INTO v_upper_sal_limit

FROM employees;

SELECT MAX(salary)/10 INTO v_lower_sal_limit

FROM employees;

IF :new.salary NOT BETWEEN v_lower_sal_limit AND v_upper_sal_limit

THEN

RAISE_APPLICATION_ERROR(-20001,'salary out of allowed range');

END IF;

END SalaryTrig;

/

Notes: Application error number is a parameter between –20,000 and –

20,999.

You could also stop the insert by "poisoning" it, changing a

:new

buffer value to one that you know will not pass constraint

evaluation.CA105: RDBMS Gauravkumarsingh Gaharwar

64