Post on 02-Jan-2016
description
transcript
Chapter SeventeenSubprogramming
Objective:–Procedures
–Functions
–Packages
Chapter 17: Subprogramming 2
Stored Procedures:
• Advantages of Stored Procedures:• Call Stored Procedure from PL/SQL:
Raise_salary ( id, amount);• Call Stored Procedure from SQL:
EXECUTE Raise_salary ( id, amount);
• Running Stored Procedure owned by other user:
EXECUTE Mohsen.Raise_salary ( id, amount);
Chapter 17: Subprogramming 3
Stored Procedures:
• Rename Stored Procedure owned by other user:
CREATE SYNONYM my_Raise_salary FOR Mohsen.Raise_salary;
EXECUTE my_Raise_salary ( id, amount);
Chapter 17: Subprogramming 4
1 – Procedure Syntax
--Header:
CREATE [OR REPLACE] PROCEDURE P_Name [(P1, P2,..)]
[ IS | AS]
--Local_declarations
--Body:
BEGIN
--Executable_statements
[EXCEPTION exception_handling]
END [P_Name];
Chapter 17: Subprogramming 5
Procedures (Example)
PROCEDURE Raise_salary (faculty_ID NUMBER, amount NUMBER) IScurrent_salary NUMBER; -- Declarationsalary_missing EXCEPTION;
BEGINSELECT Salary INTO current_salary --ExecutionFROM FacultyWHERE ID=faculty_ID;IF current_salary IS NULL THEN
RAISE salary_missingELSE
UPDATE FacultySET Salary = Salary + amount WHERE ID= faculty_ID;
END IF; Continued
Chapter 17: Subprogramming 6
Procedures (Example)
EXCEPTION --Exception
WHEN NO_DATA_FOUND THEN
INSERT INTO Logfile_Salary
VALUES (Faculty_ID, ‘NOT exist’);
WHEN salary_missing THEN
INSERT INTO Logfile_Salary
VALUES (Faculty_ID, ‘No Salary’);
END Raise_salary;
/
Chapter 17: Subprogramming 7
Procedures
-- To call a procedureRaise_Salary(111, 250);
-- To call a procedure without parameters
Proc_one;
Proc_one();
Chapter 17: Subprogramming 8
Actual and Formal Parameters:
CREATE PROCEDURE p1 (x: STRING)BEGIN…..END;
--Procedure calln NUMBER(5);p1(n);…SQL> EXEC p1(‘Mary’);
Chapter 17: Subprogramming 9
Why Use Subprogramming
a. Extensibility:PROCEDURE NewDept (NewName VARCHAR2, NoFaculty NUMBER) ISBEGIN
INSERT INTO Dept VALUES (NewName, NoFaculty);END;
b. Abstractionc. Modularityd. Reusabilitye. Maintainability
Chapter 17: Subprogramming 10
Constrain on Datatypes
CREATE PROCEDURE AddName (Name VARCHAR2(20), …) --illegal
DECLARE
SUBTYPE vchar20 is VARCHAR2(20);
CREATE PROCEDURE AddName (Name vchar20, …)
Chapter 17: Subprogramming 11
Procedures (Example 2)
CREATE OR REPLACE PROCEDURE NewStudent (P_first Student.First%TYPE,P_last Student.Last%TYPE,P_Major Student.Major%TYPE)
ASBEGIN
INSERT INTO Student ( ID, First, Last, Major) VALUES (Student_sequence.NEXTVAL, P_first, P_last,
P_Major);END NewStudent;…….NewStudent(‘Jim’, ‘Johnson’, ‘COSC’);
Chapter 17: Subprogramming 12
2 – Functions Syntax
[CREATE [OR REPLACE]]
FUNCTION F_Name [(P1, P2,..)] RETURN datatype[ IS | AS]
Local_declarationBEGIN
executable_statements[EXCEPTION exception_handling]END [F_Name];
Chapter 17: Subprogramming 13
Functions (Example)
CREATE FUNCTION Salary_OK (Salary REAL, Title VARCHAR2) RETURN BOOLEAN -- HeaderIS
Min_Salary REAL; -- DeclarationMax_Salary REAL;
BEGIN -- ExecutionSELECT L_Sal, H_Sal INTO Min_Salary, Max_SalaryFROM FacultyWHERE Job=Title;RETURN (Salary >= Min_Salary) AND (Salary <= Max_Salary);
END Salary_OK;
Chapter 17: Subprogramming 14
Calling Functions
IF Salary_OK(20000,’MANAGER’)
THEN ……….
--
A := Function1();
A := Function1 ;
Chapter 17: Subprogramming 15
Calling Functions
DECLAREMyName VARCHAR2(50) := F1();Name VARCHAR2(75) := F2(‘John’);
BEGIN--------
DECLAREa StudentInfo := StudentInfo(111, ‘Mary’, COSC’, 2.4);
BEGIN…
-------DECLARE
FacultyInfo Faculty%ROWTYPE;BEGIN
FacultyInfo := F3(1111);
Chapter 17: Subprogramming 16
Parameter Modes
• IN (Default) pass by reference (Read Only)
• OUT pass by value (Write Only)
• IN OUT pass by value (Read & Write)
Chapter 17: Subprogramming 17
Example
CREATE PROCEDURE One( a IN INTEGER, c IN OUT INTEGER, b OUT INTEGER) IS
DECLARE x: INTEGER; y: INTEGER ;
Beginb := a; -- legala:= 10; -- illegalb:= 10; -- legalx:= c; -- legaly:=b; --possibly legalc:= 10; -- legal
END;
Chapter 17: Subprogramming 18
Comparison of IN, OUT, IN OUT
IN OUT IN OUT Default Pass values to
Formal parameters act like a constant Formal parameter can’t be assigned a value Actual parameter can be constant, initialized variable, literal, or expression
Actual parameter is passed by reference
Must be specified Returns value Formal parameters act like variable Formal parameter must be assigned a value Actual parameter must be a variable
Actual parameter is passed by value; Unless NOCOPY
Must be specified Pass initial value to, returns value Formal parameters act like an initial variable Formal parameter must be assigned a value Actual parameter must be a variable
Actual parameter is passed by value; Unless NOCOPY
Chapter 17: Subprogramming 19
Practice:
Create a function to calculate the semester GPA of each student. Call it:
Cal_gpa
-Input student id, semester number.
-Return the GPA for that student.
Chapter 17: Subprogramming 20
Positional & Named Subprogram Parameters
PROCEDURE Test (first REAL, second INTEGER) ISBEGIN…..END
--Call procedure TestOne REAL;Two INTEGER;
Test (One, Two); --Positional notationTest (second => Two, first => One); --Named notationTest (first => One, second => Two); --Named notationTest (One, second => Two); --Mixed notation
Chapter 17: Subprogramming 21
Concept of NOCOPY
CREATE PROCEDURE Two (S IN OUT
NOCOPY NUMBER , Value OUT NOCOPY num_varray)
BEGIN
…..
END;
Chapter 17: Subprogramming 22
Dropping Functions & Procedures• DROP PROCEDURE P_name;
• DROP FUNCTION F_name;
Chapter 17: Subprogramming 23
Subprogram Using a Default Value
CREATE PROCEDURE Three (Today DATE DEFAULT SYSDATE,
ZipCode CHAR DEFAULT ‘21532’) IS
BEGIN
….
END;
Chapter 17: Subprogramming 24
Default Values
PROCEDURE WhoIs(Name IN VARCHAR2 DEFAULT ‘Hana’,Born_at IN DATE DEFAULT SYSDATE) IS
Begin….. END;--Procedure call
WhoIs (‘Mary’, To_DATE(’01-12-2002’, ‘MM-DD-YYYY));WhoIs(‘Marry’);WhoIs;WhoIs(Born_at => To_DATE(’03-03-1954’, ‘MM-DD-YYYY));
Chapter 17: Subprogramming 25
Subprogram within subprogram
PROCEDURE OUTSIDE (date_in IN DATE) ISPROCEDURE inside1 ISBEGIN
…….END;Function inside2 (Next_In IN INTEGER)
RETURN BOOLEANISBEGIN
…..END;
BEGIN -- OUTSIDE….END OUTSIDE;
Chapter 17: Subprogramming 26
Recursion
• --n!= n*(n-1)!FUNCTION fact (n POSITIVE) RETURN
INTEGER ISBEGIN
IF n=1 THEN RETURN 1;
ELSERETURN n* fact (n-1);
END IF;END FACT;
Chapter 17: Subprogramming 27
Forward Declaration
DECLAREPROCEDURE TWO; --Forward DeclarationPROCEDURE ONE ISBEGIN
TWO;END;PROCDURE TWO ISBEGIN
ONE;END;
Chapter 17: Subprogramming 28
Side Effects of Subprogramming Called From SQL
• When a function is called from SELECT, INSERT, UPDATE, or DELETE
the function can not modify any database tables.
• When called from INSERT, UPDATE, or DELETE
the function can not query or modify any database tables modified by that
statement.
Chapter 17: Subprogramming 29
Side Effects of Subprogramming Called From SQL
When called from SELECT, INSERT, UPDATE, or DELETE
the function can not execute any:• Control statement
• Session control
• System control statement
• DDL statement
Chapter 17: Subprogramming 30
Creating Package Specification:
CREATE [OR REPLACE ] PACKAGE P_name [IS |AS ]
--package specification:
--functions, procedures, variables, --constant, cursors, exceptions
END [P_name];
Chapter 17: Subprogramming 31
Packaging subprograms Package Specification:
CREATE PACKAGE Salary_Pack ASSUBTYPE NameType is VARCHAR2(100);
PROCEDURE Hire(Fac_Id INTEGER, Name VARCHAR2);PROCEDURE Fire(Fac_ID INTEGER);PROCEDURE Raise_Salary(Fac_Id INTEGER, Amount REAL);
END Salary_Pack;
Chapter 17: Subprogramming 32
Creating Package Body:
Syntax:
CREATE [OR REPLACE] PACKAGE BODY p_name [IS |AS]
--package boady
END p_name;
Chapter 17: Subprogramming 33
Packaging subprograms
Package Body:CREATE PACKAGE BODY Salary_Pack AS
PROCEDURE Hire(Fac_Id INTEGER, Name VARCHAR2) ISBEGIN
INSERT INTO faculty VALUES (fac_ID, Name);END;PROCEDURE Fire (Fac_ID INTEGER) ISBEGIN
DELETE FROM Faculty WHERE ID = Fac_ID;END; PROCEDURE Raise_Salary (Fac_Id INTEGER, Amount REAL) ISBegin
UPDATE facultySET Salary = Salary + AmountWHERE ID = Fac_ID;
End;END Salary_Pack;/
Chapter 17: Subprogramming 34
Use of Packages
BEGINSalary_Pack.Hire(1111,‘Lorry’)
END;
/
Chapter 17: Subprogramming 35
When To Use Packages
• Encapsulation Data (hidden)
• Avoid hard-coding literals
• Grouping together logically related functions
Chapter 17: Subprogramming 36
Why Packages
CREATE or REPLACE PROCEDURE fac_name(Fac_ID IN faculty.id%TYPE) IS
FullName VARCHAR2(100);
BEGINSELECT Last_name || ‘, ‘ || first_nameINTO FullNameFROM facultyWHERE faculty.id = Fac_ID;
END;
Chapter 17: Subprogramming 37
Why Packages
Problems:1. Length of FullName is hard-coded
2. How about if I want to see ‘first, last’ name?
3. If I need different form of the same code in my applications: How should I maintain my code?
Chapter 17: Subprogramming 38
Why Packages
CREATE OR REPLACE PACKAGE faculty_pkg ASSUBTYPE FullName_t IS VARCHAR2(200);
FUNCTION fac_Name (Last_In faculty.last_name%TYPE, First_In faculty.first_name%TYPE)
RETURN fullName_t;
FUNCTION fac_Name(f_id IN faculty.id%TYPE)RETURN fullName_t;
END faculty_pkg;
Chapter 17: Subprogramming 39
Why Packages
CREATE OR REPLACE PACKAGE BODY faculty_pkg AS
FUNCTION fac_Name(Last_In faculty.last_name%TYPE, First_In faculty.first_name%TYPE)RETURN fullName_t IS
BEGINRETURN Last_In || ‘, ‘ || First_In
END;
Chapter 17: Subprogramming 40
Why Packages
FUNCTION fac_Name(f_id IN faculty.id%TYPE) RETURN fullName_t; IStemp FullName_t;
BEGINSELECT INTO temp fac_name(LastName, FirstName)FROM faculty WHERE faculty.id = id;RETURN temp;
EXCEPTIONWHEN NO_DATA_FOUND THEN
RETURN NULL;WHEN TOO_MANY_ROWS THEN
…..END;
END faculty_pkg;
Chapter 17: Subprogramming 41
Package and Local Variables:
CREATE OR REPLACE PACKAGE BODY faculty_pkg IS
TodayDate Date;FUNCTION fac_Name ………..……END fac_Name;……..BEGIN –package
SELECT SYSDATE into TodayDateFROM DUAL;
END faculty_pkg;/
Chapter 17: Subprogramming 42
Overloading
CREATE OR REPLACE PACKAGE Student_Pack AS
PROCEDURE AddStudent( P_ID IN Student.id%TYPE,
P_Name IN Student.Name%TYPE,
P_Major IN Student.Major%TYPE);
PROCEDURE AddStudent( P_ID IN Student.id%TYPE,
P_Name IN Student.Name%TYPE);
END Student_Pack;
Chapter 17: Subprogramming 43
Overloading
CREATE OR REPLACE PACKAGE BODY Student_Pack ASPROCEDURE AddStudent( P_ID IN Student.id%TYPE,
P_Name IN Student.Name%TYPE,P_Major IN Student.Major%TYPE) IS
BEGININSERT INTO Student(id, Name, Major)VALUES (P_ID, P_Name, P_Major);
END;
PROCEDURE AddStudent( P_ID IN Student.id%TYPE, P_Name IN Student.Name%TYPE) IS
BEGININSERT INTO Student(id, Name)VALUES (P_ID, P_Name);
END;
END Student_Pack;
Chapter 17: Subprogramming 44
Restriction on Overloading
• Local or Packaged subprogram, or Type methods can be overloaded
• No overloading of two subprograms with only formal parameter different in name parameter mode or datatype
• No overloading of functions that differ only in return type
Chapter 17: Subprogramming 45
Invoker’s Right:
Stored procedure executed with the privilege of their owner; (not current user).
CREATE PROCEDURE addempl(ssn NUMBER, name VARCHAR2,salary NUMBER)
AUTHID CURRENT_USER AS --vs. DEFINER BEGININSERT INTO employee VALUES (ssn, name,
salary);END;_
Chapter 17: Subprogramming 46
Invoker’s Right:
USER_USERS:
USERNAME
USER_ID
Default_tablespace
STATUS
Chapter 17: Subprogramming 47
Subprogram Location
Subprograms:
• Text
• Compiled: P_code
Chapter 17: Subprogramming 48
Subprogram Location
Example
CREATE OR REPLACE PROCEDURE Simple AS
a NUMBER;
BEGIN
a:= 10;
END Simple;
Chapter 17: Subprogramming 49
Subprogram Location
• USER_OBJECTS
• USER_SOURCE
• USER_ERRORS
SQL> SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
FROM USER_OBJECTS
WHERE OBJECT_NAME = ‘SIMPLE’;
OBJECT_NAME OBJECT_TYPE STATUS
SIMPLE PROCEDURE VALID
Chapter 17: Subprogramming 50
Subprogram Location
SQL> SELECT TEXT
FROM USER_SOURCE
WHERE NAME = ‘SIMPLE’ AND TYPE= ‘PROCEDURE’
ORDER BY line;
TEXT
-----------------------------------------
CREATE OR REPLACE PROCEDURE Simple AS
a NUMBER;
BEGIN
a:= 10;
END Simple;
Chapter 17: Subprogramming 51
TABLE FUNCTION
CREATE TYPE Book_Type AS OBJECT(name VARCHAR2(50),author VARCHAR2(30),Description VARCHAR2(500));
CREATE TYPE BookSet_Type AS TABLE of Book_Type;
CREATE TABLE catalogs(Name VARCHAR2(20),cat CLOB);
CREATE FUNCTION GetBooks(a CLOB) RETURN BookSet_Type;
SELECT X.name, y.name, y.other, y.descriptionFROM Catalogs X, TABLE (GetBooks(x.cat)) y;
Chapter 17: Subprogramming 52
Find Errors:
• SQL> SHOW ERRORS;-Line number of the error
-Column number of the error
-Text message of the error
• SQL> SELECT line, position, text
FROM USER_ERRORS
WHERE name=‘RAISE_SALARY’ AND TYPE=‘PROCEDURE’;
Chapter 17: Subprogramming 53
Explicit Recompilation of Procedures, Functions, Packages
ALTER PROCEDURE name COMPILE;
ALTER FUNCTION name COMPILE;
ALTER PACKAGE name COMPILE;
Chapter 17: Subprogramming 54
Why PL/SQL?
CREATE PROCEDURE proc_data (p_input IN VARCHAR2)ASBEGIN
FOR i IN (SELECT *FROM facultyWHERE name LIKE p_input) LOOP
process (i);END LOOP;
END;
Chapter 17: Subprogramming 55
Why PL/SQL?
• PL/SQL datatypes are SQL datatypes.
• There is tight coupling between the language and the database.
• No need for OPEN, CLOSE etc.
• Protected from many changes in the database.
• Portable and reusable.