+ All Categories
Home > Documents > Oracle PL/SQL III

Oracle PL/SQL III

Date post: 16-Mar-2016
Category:
Upload: hastin
View: 77 times
Download: 8 times
Share this document with a friend
Description:
Oracle PL/SQL III. Cursors Procedures Functions. iSQLplus: http://uadisq01.uad.ac.uk:5560/isqlplus. Remember the SELECT INTO…… ?. It only allowed the retrieval of one row. Select attribute into variable from … where … Or Select count(*) into variable from ………. - PowerPoint PPT Presentation
23
1 Oracle PL/SQL III Cursors Procedures Functions iSQLplus: http://uadisq01.uad.ac.uk:5560/isqlplu s
Transcript
Page 1: Oracle PL/SQL  III

1

Oracle PL/SQL III

CursorsProceduresFunctions

iSQLplus: http://uadisq01.uad.ac.uk:5560/isqlplus

Page 2: Oracle PL/SQL  III

2

Remember the SELECT INTO…… ?

It only allowed the retrieval of one row

Select attribute into variable from … where …

Or

Select count(*) into variable from ………

But when we want to retrieve multiple rows we need to use what is called a CURSOR

Page 3: Oracle PL/SQL  III

3

What is the Cursor structure?

Declare it– This is achieved by a SELECT command– And by giving the CURSOR a name

Open it Fetch row(s) from it Close it

Page 4: Oracle PL/SQL  III

4

Declaring the Cursor

DECLARECURSOR low_pay

IS SELECT surname,salaryFROM Personnelwhere salary < 12000;

v_surname personnel.surname%TYPE;v_salary personnel.salary%TYPE;BEGIN…..

Because a cursor is associated with multiple rows they are normally used with LOOP structures

Page 5: Oracle PL/SQL  III

5

OPEN, FETCH, CLOSE, %NOTFOUNDDECLARE

CURSOR low_pay IS SELECT surname,salary FROM Personnel where salary < 30000;

v_surname personnel.surname%TYPE;v_salary personnel.salary%TYPE;BEGIN

OPEN low_pay; LOOP

FETCH low_pay INTO v_surname, v_salary; EXIT when low_pay%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_surname ||' '||

v_salary); END LOOP;CLOSE low_pay;

END;

Block1

Page 6: Oracle PL/SQL  III

6

A variation using WHILE Loop and %FOUND

DECLARECURSOR low_pay IS SELECT surname,salary FROM Personnel where salary < 30000;

v_surname personnel.surname%TYPE;v_salary personnel.salary%TYPE;BEGIN

OPEN low_pay; FETCH low_pay INTO v_surname, v_salary;

WHILE low_pay%FOUND LOOP DBMS_OUTPUT.PUT_LINE(v_surname ||' '||

v_salary); FETCH low_pay INTO v_surname, v_salary;

END LOOP;CLOSE low_pay;

END; Note 2 FETCH commands

Page 7: Oracle PL/SQL  III

7

Parameters in CursorsDECLARE

CURSOR c_salary (p_min number,p_max number) IS SELECT surname,salary FROM Personnel

where salary between p_min and p_max;v_surname Personnel.surname%TYPE;v_salary Personnel.salary%TYPE;BEGIN

OPEN c_salary(&p_min, &p_max); LOOP

FETCH c_salary INTO v_surname, v_salary;EXIT WHEN c_salary%NOTFOUND; DBMS_OUTPUT.PUT_LINE(v_surname||' '||v_salary);

END LOOP;CLOSE c_salary;

END;

These would be in quotes for VARCHAR2 variables

Block2

Page 8: Oracle PL/SQL  III

8

FOR LOOP requires no CURSOR OPEN, FETCH, CLOSE

DECLARECURSOR c_salary IS SELECT surname,salary

FROM Personnel where salary < 30000;

BEGINFOR counter in c_salary LOOP

DBMS_OUTPUT.PUT_LINE(counter.surname ||' '||counter.salary);

END LOOPEND;

Page 9: Oracle PL/SQL  III

9

SELECT FOR UPDATE Cursors

DECLARECURSOR c_salary IS SELECT surname,salary FROM Personnel

FOR UPDATE;v_surname personnel.surname%TYPE;v_salary personnel.salary%TYPE;BEGIN

OPEN c_salary; LOOP

FETCH c_salary INTO v_surname, v_salary;EXIT WHEN c_salary%NOTFOUND;UPDATE Personnel SET BONUS=v_salary*0.05 WHERE

CURRENT of c_salary; END LOOP;CLOSE c_salary;

END;

Useful when updating or deleting each row fetched in a cursor otherwise all would be updated at once

Page 10: Oracle PL/SQL  III

10

Stored Procedures

A unit of code that performs one or more tasks After completion, execution returns to the calling

block To run the procedure at any time, use

EXECUTE <procedure_name>

CREATE OR REPLACE PROCEDURE proc_nameIS<declarations of variables, cursors etc> ……..BEGIN

<executing code> …..END proc_name;

Page 11: Oracle PL/SQL  III

11

Example Procedure with a cursor

CREATE OR REPLACE PROCEDURE surnamesIS

CURSOR c_staff IS SELECT surnameFROM Personnel where div=10;

BEGINFOR names IN c_staff LOOP

DBMS_OUTPUT.PUT_LINE(names.surname);END LOOP

END;

The message ‘Procedure created’ should be displayed

Page 12: Oracle PL/SQL  III

12

Example Procedure to update salaries and how to test it

CREATE OR REPLACE PROCEDURE sal_updateISBEGIN

UPDATE personnel set salary=salary*1.1 where div=10;

END;

Execute sal_update;Select salary from personnel where div=10;

- to test the procedure

Block3

Page 13: Oracle PL/SQL  III

13

Passing parameters

CREATE OR REPLACE PROCEDURE test(firstpar IN varchar2,

secondpar IN Date)IS

empname varchar2(30);empid number(8);

BEGIN……..

END;

Parameter name Parameter mode datatype

IN is the default if no mode specified

Notice parameter

declarations are

unconstrained

Page 14: Oracle PL/SQL  III

14

IN

CREATE OR REPLACE PROCEDURE t( p_salary IN Number)

ISBEGIN

……..p_salary:=p_salary + 100;

END;

This is illegal as parameter can only be referenced, not changed

CREATE OR REPLACE PROCEDURE t( p_salary IN Number,

ISv_salary number(15);

BEGIN……..v_salary:=p_salary + 100;

END;

This is legal as parameter is assigned to a variable first

Page 15: Oracle PL/SQL  III

15

IN Example

CREATE OR REPLACE PROCEDURE proc_IN( p_branchNumber IN Number,

p_percent IN Number)ISBEGIN

UPDATE Personnel set salary=salary+salary*p_percent/100where div = p_branchNumber;

END;

EXECUTE proc_IN(10,25)

Block4

Page 16: Oracle PL/SQL  III

16

Actual and Formal parametersCREATE OR REPLACE PROCEDURE updperc( p_percent IN Number,

p_Emp IN Number)IS

CURSOR staff_cur IS SELECT joindate, div from Personnel where managedBy=p_Emp;

BEGINFor stf in staff_cur LOOP

updStaff(stf.joindate,stf.div);END LOOP;…

END;

Formal

Actual

CREATE OR REPLACE PROCEDURE

updstaff( p_joindate IN Date,

p_div IN Number)IS….

EXECUTE updperc(10,3455)

The Calling Procedure

Page 17: Oracle PL/SQL  III

17

Another Calling Example

DECLAREv_var NUMBER := 20;

BEGINdelete_staff(v_var);

END;

CREATE OR REPLACE PROCEDURE delete_staff(p_branchNumber IN Number)ISBEGIN

DELETE PersonnelWHERE div=p_branchNumber;

END;

Anonymous block calls procedure

Block5

Page 18: Oracle PL/SQL  III

18

Using parameters in Loops

To execute this procedure (e.g insert values from 30 to 32)

EXECUTE insert_root(30,32)

CREATE OR REPLACE PROCEDUREinsert_root (from_val NUMBER, to_val NUMBER)ISnum NUMBER;BEGINFOR num IN from_val .. to_val LOOP

INSERT INTO roots VALUES (num, SQRT(num));END LOOP;END;

Page 19: Oracle PL/SQL  III

19

FUNCTIONS

Functions are similar to procedures They are used for calculations and returning a

valueCREATE OR REPLACE FUNCTION

function_name (parameter list)

RETURN return_datatypeIS … variables, cursors etcBEGIN

Execution code ………………;Return expression;

END;

Can be:NUMBERVARCHAR2BOOLEAN etc

Page 20: Oracle PL/SQL  III

20

RETURN Statement

Determines– The point at which execution returns to the calling

block AND the value that is assigned to it RETURN expression

– Where expression can be any legal PL/SQL expression

v_salary := get_salary(10)

Block calls the function get_salary for employee 10Get_salary will return the salary for employee 10 and this will be assigned to v_salary

Page 21: Oracle PL/SQL  III

21

Example Function

SET SERVEROUTPUT ONDECLAREV_divID personnel.div%type;v_divName branch.DivName%type:='&divName';V_aveSalary personnel.salary%type;BEGINSELECT div into v_divIDFROM branch WHERE divname=v_divName;v_aveSalary:=get_aveSal(v_divID);DBMS_OUTPUT.PUT_LINE('Division '||v_divID||' has '||

v_aveSalary||' average salary');END;

CREATE OR REPLACE FUNCTION get_aveSal

(i_div IN NUMBER)RETURN number

ISv_salary personnel.salary

%type;BEGIN

SELECT avg(salary)INTO v_salary FROM PersonnelWHERE div=i_div;RETURN v_salary;

END get_aveSal;

"get the average salary for ADMIN"Block prompts for division name then passes the division number to the function get_aveSal

Block6

Page 22: Oracle PL/SQL  III

22

Summary

CURSORS– To process all rows of a selected set

STORED PROCEDURES– Parameters– Calling them

FUNCTIONS– Parameters– Return– Calling them

Page 23: Oracle PL/SQL  III

23

READING

• Connolly/Begg (4th ed) 8.2.4• Earp/Bagui Ch. 12, 13• Shah Part 3 (Ch 10,12)• Morrison/Morrison Ch.4, 9 – selected bits• Casteel, J (2003). Oracle 9i Developer:

PL/SQL Programming


Recommended