Top Banner
1 Enhanced Guide to Enhanced Guide to Oracle8i Oracle8i Chapter 5: Advanced PL/SQL Programming
73
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: Download

1

Enhanced Guide to Enhanced Guide to Oracle8iOracle8i

Chapter 5:Advanced PL/SQL Programming

Page 2: Download

2

Anonymous PL/SQL Programs Write code in text editor, execute it

in SQL*Plus Code can be stored as text in file

system Program cannot be called by other

programs, or executed by other users

Cannot accept or pass parameter values

Page 3: Download

3

Named PL/SQL Programs Can be created:

Using text editor & executed in SQL*Plus Using Procedure Builder

Can be stored: As compiled objects in database As source code libraries in file system

Can be called by other programs Can be executed by other users

Page 4: Download

4

Named Program Locations Server-side

Stored in database as database objects

Execute on the database server Client-side

Stored in the client workstation file system

Execute on the client workstation

Page 5: Download

5

Named Program Types Program Units (client or server-

side) Procedures Functions

Libraries (client-side) Packages (client or server-side) Triggers (server-side)

Page 6: Download

6

Program Units Procedures

Can receive and pass multiple parameter values

Can call other program units Functions

Like procedures, except they return a single value

Page 7: Download

7

Variables used to pass data values in/out of program units

Declared in the procedure header Parameter values are passed

when the procedure is called from the calling program

Parameters

Page 8: Download

8

Parameter Modes IN

Incoming values, read-only OUT

Outgoing values, write-only IN OUT

Can be both incoming and outgoing

Page 9: Download

9

Creating a Procedure CREATE OR REPLACE PROCEDURE procedure_name

(parameter1 mode datatype, parameter2 mode datatype, … ) IS | AS local variable declarationsBEGIN program statementsEXCEPTION exception handlersEND;

header

body

Page 10: Download

10

Executing a Procedure EXECUTE procedure_name (parameter1_value, parameter2_value, …);

Page 11: Download

11

Formal parameters: declared in procedure header

Actual parameters: values placed in parameter list when procedure is called

Values correspond based on orderProcedure Header:

PROCEDURE calc_gpa (s_id IN NUMBER, term_id IN NUMBER, gpa OUT NUMBER);

Procedure Call:calc_gpa (current_s_id, 4, current_gpa);

Parameter Types

Formal Parameters

Actual Parameters

Page 12: Download

12

Debugging Named Program Units in SQL*Plus Isolate program lines causing

errors and then fix them Use SHOW ERRORS command to

view compile error details Use DBMS_OUTPUT.PUT_LINE

commands to view intermediate values and track program flow

Page 13: Download

13

Creating a FunctionCREATE OR REPLACE FUNCTION function_name

(parameter1 mode datatype, parameter2 mode datatype, … ) RETURN function_return_data_typeIS local variable declarationsBEGIN program statements RETURN return_value;EXCEPTION exception handlers

RETURN EXCEPTION_NOTICE;END;

header

body

Page 14: Download

14

Function Syntax Details RETURN command in header specifies

data type of value the function will return

RETURN command in body specifies actual value returned by function

RETURN EXCEPTION_NOTICE instructs the function to display the except notice in the calling program

Page 15: Download

15

Calling a Function Can be called from either named

or anonymous PL/SQL blocks Can be called within SQL queries

return_value := function_name(parameter1_value, parameter2_value, …);

Page 16: Download

16

Stored Program UnitObject Privileges Stored program units exist as

objects in your database schema To allow other users to use your

units, you must grant them EXECUTE privileges

GRANT EXECUTE ON unit_name TO username;

Page 17: Download

17

Using Stored Program UnitsThat Belong to Other Users You must have been granted the

privilege to use it You must preface the unit name

with the owner’s username

return_value := LHOWARD.my_function

TO_DATE(’07/14/1958’, ‘MM/DD/YYYY’);

Page 18: Download

18

Using Procedure Builder to Create Named Program Units Procedures and functions created in

Notepad/SQL*Plus are always server-side Stored in the database Executed on the database server

Procedure Builder can be used to create client-side libraries of procedures and functions Stored in the client file system Executed on the client

Page 19: Download

19

Procedure Builder Client-SideFile Types .pls

Single program unit Uncompiled source code Can only be opened/modified in Procedure

Builder .pll

Library of procedures or functions Compiled code Can be referenced in other Developer

applications (Forms, Reports)

Page 20: Download

20

Procedure Builder Interface

ObjectNavigatorWindow

PL/SQLInterpreterWindow

commandpromptpane

sourcecodepane

Page 21: Download

21

Program Unit Editor Interface

Button barProcedurelistProcedure

template

Status line

Sourcecode pane

Page 22: Download

22

Creating Client-Side Objects in Procedure Builder Client-side program unit source

code Create program unit in Program Unit

Editor, export text to .pls file Client-side library

Click File, click Save As, and specify to save library .pll file in file system

Page 23: Download

23

Executing a Procedure in Procedure Builder Load program unit as a top-level

Program Unit object Type the procedure name and

parameter list values at the command prompt

Page 24: Download

24

Set a breakpoint on the program line where execution will pause

Single-step through the program lines and examine current variable values Global variables Stack (local) variables

View program execution path

Using the PL/SQL Interpreterto Find Runtime Errors

Page 25: Download

25

Setting a Breakpoint Load program unit in PL/SQL

Interpreter window Double-click line to create

breakpoint

Breakpoint

Page 26: Download

26

Viewing Program Variable Values During Execution

Variablevalues

Executionarrow

Page 27: Download

27

Strategy For Using the PL/SQL Interpreter Debugger Run the program, and determine

which line is causing the run-time error

Run the program again, and examine variable values just before the error occurs to determine its cause

Page 28: Download

28

Calling Procedures From Other Procedures

Use procedure name followed by parameter list

procedure_name(parameter1_value, parameter2_value, …);

Page 29: Download

29

Creating Server-Side Objects in Procedure Builder Stored program units

Drag program unit from top-level node in Procedure Builder to Program Units node under Database node

Libraries Click File, click Save As, and specify to

save library in database Regardless of storage location, PL/SQL

libraries ALWAYS execute on client

Page 30: Download

30

Program Unit Dependencies Object dependencies

Program units are dependent on the database objects they reference (tables, views, sequences, …)

Procedure dependencies Program units are dependent on other

program units they call

Page 31: Download

31

Direct and Indirect Dependencies Direct dependency

Object or program is directly called or referenced

Indirect dependency Object or program is called or

referenced by a subprogram

Page 32: Download

32

Direct and Indirect Dependencies

Direct Dependency

Indirect Dependency

CREATE_NEW_ORDER

CUST_ORDER

CREATE_NEW_

ORDER_LINE

ORDER_LINE

ORDER_ID_SEQUENCE

ORDER_ID_SEQUENCE

Page 33: Download

33

Invalidation If an object or program on which a

program has a dependency is changed, the program is invalidated, and must be recompiled

Page 34: Download

34

Packages Server-side code library Can contain:

Global variable declarations Cursors Procedures Functions

Page 35: Download

35

Differences Between Packages and Libraries Libraries have to be explicitly

attached to applications, while packages are always available to be called by applications

Libraries always execute on client Packages always execute on

server

Page 36: Download

36

Package Components Specification

Used to declare all public variables, cursors, procedures, functions

Body Contains underlying code for procedures and

functions Rationale:

Specification is visible to users, gives details on how to use

Body is not visible, users don’t care about details

Page 37: Download

37

Creating a Package Specification in SQL*Plus

CREATE OR REPLACE PACKAGE package_name IS --public variables variable_name datatype;

--program units PROCEDURE procedure_name (parameter_list); FUNCTION function_name (parameter_list);END;

Page 38: Download

38

Creating a Package Specification in SQL*Plus

Page 39: Download

39

Creating a Package Body in SQL*Plus

CREATE OR REPLACE PACKAGE BODY package_name IS private variable declarations program unit blocksEND;

Page 40: Download

40

Creating a Package Body in SQL*Plus

Page 41: Download

41

Calling a Program Unit That Is In a Package Preface the program unit name

with the package name

PACKAGE_NAME.program_unit_name(parameter_list);

Example:

DBMS_OUTPUT.PUT_LINE(‘Hello World’);

Page 42: Download

42

Overloading Program Units in Packages Overloading

Multiple program units have the same name, but accept different input parameters

Allows user to use the same command to perform an action but pass different parameter values

Page 43: Download

43

Package Specification With Overloaded Procedures

Page 44: Download

44

Saving Packages as Database Objects Expand the Database Objects node

so your username appears, and expand your username so the Stored Program Units node appears

Drag the Package Specification and Package Body under the Stored Program Units node

Page 45: Download

45

Database Triggers Program units that are attached to

a specific table Execute in response to the

following table operations: INSERT UPDATE DELETE

Page 46: Download

46

Uses For Database Triggers Force related operations to always

happen Sell an item, update QOH

Create a table that serves as an audit trail Record who changes a student grade

and when they change it

Page 47: Download

47

Creating Database Triggers Code is similar to all PL/SQL

program unit blocks Database triggers cannot accept

parameters

Page 48: Download

48

Defining Triggers To define a trigger, you must specify:

Statement type that causes trigger to fire

INSERT, UPDATE, DELETE Timing

BEFORE or AFTER Level

STATEMENT or ROW

Page 49: Download

49

Trigger Timing BEFORE: trigger fires before

statement executes Example: for audit trail, records

grade value before it is updated AFTER: trigger fires after

statement executes Example: update QOH after item is

sold

Page 50: Download

50

Trigger Levels ROW: trigger fires once for each row that

is affected Example: when adding multiple order lines,

update multiple inventory QOH values STATEMENT: trigger fires once,

regardless of how many rows are updated Example: for audit trail, you just want to

record that someone updated a table, but you don’t care how many rows were updated

Page 51: Download

51

Creating a Trigger in SQL*PlusCREATE OR REPLACE TRIGGER trigger_name[BEFORE|AFTER] [INSERT|UPDATE|DELETE] ONtable_name [FOR EACH ROW] [WHEN (condition)]BEGIN trigger bodyEND;

Page 52: Download

52

Creating a Statement-Level Trigger in SQL*Plus

Page 53: Download

53

Trigger Restrictions You can only create triggers on

tables that you own You must have the CREATE

TRIGGER system privilege You cannot execute a COMMIT

command in a trigger

Page 54: Download

54

Row-Level Trigger Syntax WHEN (condition):

Optional Specifies to fire only when a row

satisfies a certain search condition Referencing old and new values in

the trigger body: :OLD.field_name :NEW.field_name

Page 55: Download

55

Creating a Row-Level Trigger in SQL*Plus

Page 56: Download

56

Creating a Trigger in Procedure Builder In the Object Navigator Pane,

expand the Database Objects node, expand your username, and select the table to which the trigger will be attached

Create a new trigger Specify the trigger properties

Page 57: Download

57

Specifying Trigger Properties in Procedure Builder

TimingStatementtype

Triggername

Field

WHENconditionTriggerbody

Level

Page 58: Download

58

INSTEAD-OF Triggers Fire when a user issues a DML

command associated with a complex view Normally, users cannot insert, update,

or delete records associated with complex views that are created by joining multiple tables

Page 59: Download

59

Creating an INSTEAD-OF Trigger in SQL*Plus

Page 60: Download

60

Disabling and Dropping Triggers Syntax to drop a trigger:DROP TRIGGER trigger_name;

Syntax to enable or disable a trigger:

ALTER TRIGGER trigger_name [ENABLE | DISABLE];

Page 61: Download

61

Oracle Built-In Packages Provide support for basic database

functions Owned by the SYS database

schema

Page 62: Download

62

Oracle Built-In Package Types Transaction processing Application development Database and application

administration Internal support

Page 63: Download

63

Transaction Processing Packages Provide procedures to support

transaction processing DBMS_ALERT: dynamically sends

messages to other database sessions DBMS_LOCK: creates user-defined locks

on tables and records DBMS_SQL: implements Dynamic SQL DBMS_TRANSACTION: provides

procedures for transaction management

Page 64: Download

64

Application Development Packages Aid developers in creating and debugging

PL/SQL applications DBMS_DESCRIBE: returns information about the

parameters of any stored program unit DBMS_JOB: schedules PL/SQL named programs to run at

specific times DBMS_OUTPUT: provides text output in PL/SQL

programs in SQL*Plus DBMS_PIPE: sends messages to other database sessions DBMS_SESSION: dynamically changes the properties of

a database session UTL_FILE: enables PL/SQL output to be written to a

binary file

Page 65: Download

65

DBMS_JOB Package Enables PL/SQL named programs

to be run at certain times Creates a job queue

List of programs to be run, and times they are to be run

Page 66: Download

66

DBMS_PIPE Package Implements database pipes

Used to transfer information among database sessions independently of transactions

Sending a message Use the PACK_MESSAGE and SEND_MESSAGE

procedures Receiving a message

Use the RECEIVE_MESSAGE and UNPACK_MESSAGE procedures

Page 67: Download

67

Database and Application Administration Packages Support database administration tasks

DBMS_APPLICATION_INFO: registers information about programs being run by individual user sessions

DBMS_DDL: provides procedures for compiling program units and analyzing database objects

DBMS_SHARED_POOL: used to manage the shared pool

DBMS_SPACE: provides information for managing how data values are physical stored in the database

DBMS_UTILITY: provides procedures for compiling all program units and analyzing all objects in a database schema

Page 68: Download

68

Internal Support Packages Provide underlying functionality of the

Oracle database STANDARD: defines all built-in functions

and procedures, database data types, and PL/SQL data types

DBMS_SNAPSHOT: used to manage database snapshots

DBMS_REFRESH: used to refresh snapshots DBMS_STANDARD: contains common

functions of the PL/SQL language

Page 69: Download

69

Dynamic SQL Allows you to create SQL commands

as text strings in PL/SQL programs, and validate the database objects at runtime

Allows user to specify program inputs Supporting procedures are provided

in the DBMS_SQL package

Page 70: Download

70

Creating Dynamic SQL Programs that Contain DML Commands1. Open the cursor that defines the memory

area where processing is performed2. Define the SQL command as a text string,

using placeholders for dynamic values3. Parse the SQL command4. Bind input variables to placeholders5. Execute the SQL command6. Close the cursor

Page 71: Download

71

Creating Dynamic SQL Programs that Contain DDL Commands1. Open the cursor that defines the

memory area where processing is performed

2. Define the SQL command as a text string

You cannot define placeholders and dynamically bind values

3. Parse the SQL command4. Close the cursor

Page 72: Download

72

Creating Dynamic SQL Programs that Contain SELECT Commands1. Open the cursor2. Define the SQL command as a text string using

placeholders for dynamic values3. Parse the SQL command4. Bind input values to placeholders5. Define output variables6. Execute the query7. Fetch the rows8. Associate the fetched rows with the output

variables9. Close the cursor

Page 73: Download

73

Using Dynamic SQL to Create an Anonymous PL/SQL Block1. Open the cursor2. Define the SQL command as a text string

using placeholders for dynamic values3. Parse the SQL command4. Bind input and output values to

placeholders5. Execute the query6. Retrieve values of output variables7. Close the cursor