+ All Categories
Home > Documents > Chapter Seventeen Subprogramming

Chapter Seventeen Subprogramming

Date post: 02-Jan-2016
Category:
Upload: dexter-mcknight
View: 31 times
Download: 3 times
Share this document with a friend
Description:
Chapter Seventeen Subprogramming. Objective: Procedures Functions Packages. 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); - PowerPoint PPT Presentation
14
NOITE TRAIÇOEIRA! des/automáticos...aguarde
Transcript
Page 1: Chapter Seventeen Subprogramming

Chapter SeventeenSubprogramming

Objective:–Procedures

–Functions

–Packages

Page 2: Chapter Seventeen Subprogramming

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

Page 3: Chapter Seventeen Subprogramming

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

Page 4: Chapter Seventeen Subprogramming

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

Page 5: Chapter Seventeen Subprogramming

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

Page 6: Chapter Seventeen Subprogramming

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;

/

Page 7: Chapter Seventeen Subprogramming

Chapter 17: Subprogramming 7

Procedures

-- To call a procedureRaise_Salary(111, 250);

-- To call a procedure without parameters

Proc_one;

Proc_one();

Page 8: Chapter Seventeen Subprogramming

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

Page 9: Chapter Seventeen Subprogramming

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

Page 10: Chapter Seventeen Subprogramming

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, …)

Page 11: Chapter Seventeen Subprogramming

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

Page 12: Chapter Seventeen Subprogramming

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

Page 13: Chapter Seventeen Subprogramming

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;

Page 14: Chapter Seventeen Subprogramming

Chapter 17: Subprogramming 14

Calling Functions

IF Salary_OK(20000,’MANAGER’)

THEN ……….

--

A := Function1();

A := Function1 ;

Page 15: Chapter Seventeen Subprogramming

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

Page 16: Chapter Seventeen Subprogramming

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)

Page 17: Chapter Seventeen Subprogramming

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;

Page 18: Chapter Seventeen Subprogramming

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

Page 19: Chapter Seventeen Subprogramming

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.

Page 20: Chapter Seventeen Subprogramming

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

Page 21: Chapter Seventeen Subprogramming

Chapter 17: Subprogramming 21

Concept of NOCOPY

CREATE PROCEDURE Two (S IN OUT

NOCOPY NUMBER , Value OUT NOCOPY num_varray)

BEGIN

…..

END;

Page 22: Chapter Seventeen Subprogramming

Chapter 17: Subprogramming 22

Dropping Functions & Procedures• DROP PROCEDURE P_name;

• DROP FUNCTION F_name;

Page 23: Chapter Seventeen Subprogramming

Chapter 17: Subprogramming 23

Subprogram Using a Default Value

CREATE PROCEDURE Three (Today DATE DEFAULT SYSDATE,

ZipCode CHAR DEFAULT ‘21532’) IS

BEGIN

….

END;

Page 24: Chapter Seventeen Subprogramming

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

Page 25: Chapter Seventeen Subprogramming

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;

Page 26: Chapter Seventeen Subprogramming

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;

Page 27: Chapter Seventeen Subprogramming

Chapter 17: Subprogramming 27

Forward Declaration

DECLAREPROCEDURE TWO; --Forward DeclarationPROCEDURE ONE ISBEGIN

TWO;END;PROCDURE TWO ISBEGIN

ONE;END;

Page 28: Chapter Seventeen Subprogramming

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.

Page 29: Chapter Seventeen Subprogramming

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

Page 30: Chapter Seventeen Subprogramming

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

Page 31: Chapter Seventeen Subprogramming

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;

Page 32: Chapter Seventeen Subprogramming

Chapter 17: Subprogramming 32

Creating Package Body:

Syntax:

CREATE [OR REPLACE] PACKAGE BODY p_name [IS |AS]

--package boady

END p_name;

Page 33: Chapter Seventeen Subprogramming

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

Page 34: Chapter Seventeen Subprogramming

Chapter 17: Subprogramming 34

Use of Packages

BEGINSalary_Pack.Hire(1111,‘Lorry’)

END;

/

Page 35: Chapter Seventeen Subprogramming

Chapter 17: Subprogramming 35

When To Use Packages

• Encapsulation Data (hidden)

• Avoid hard-coding literals

• Grouping together logically related functions

Page 36: Chapter Seventeen Subprogramming

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;

Page 37: Chapter Seventeen Subprogramming

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?

Page 38: Chapter Seventeen Subprogramming

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;

Page 39: Chapter Seventeen Subprogramming

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;

Page 40: Chapter Seventeen Subprogramming

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;

Page 41: Chapter Seventeen Subprogramming

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

Page 42: Chapter Seventeen Subprogramming

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;

Page 43: Chapter Seventeen Subprogramming

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;

Page 44: Chapter Seventeen Subprogramming

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

Page 45: Chapter Seventeen Subprogramming

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

Page 46: Chapter Seventeen Subprogramming

Chapter 17: Subprogramming 46

Invoker’s Right:

USER_USERS:

USERNAME

USER_ID

Default_tablespace

STATUS

Page 47: Chapter Seventeen Subprogramming

Chapter 17: Subprogramming 47

Subprogram Location

Subprograms:

• Text

• Compiled: P_code

Page 48: Chapter Seventeen Subprogramming

Chapter 17: Subprogramming 48

Subprogram Location

Example

CREATE OR REPLACE PROCEDURE Simple AS

a NUMBER;

BEGIN

a:= 10;

END Simple;

Page 49: Chapter Seventeen Subprogramming

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

Page 50: Chapter Seventeen Subprogramming

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;

Page 51: Chapter Seventeen Subprogramming

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;

Page 52: Chapter Seventeen Subprogramming

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

Page 53: Chapter Seventeen Subprogramming

Chapter 17: Subprogramming 53

Explicit Recompilation of Procedures, Functions, Packages

ALTER PROCEDURE name COMPILE;

ALTER FUNCTION name COMPILE;

ALTER PACKAGE name COMPILE;

Page 54: Chapter Seventeen Subprogramming

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;

Page 55: Chapter Seventeen Subprogramming

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.


Recommended