Db Triggers05ch

73
1 Enhanced Guide to Enhanced Guide to Oracle8i Oracle8i Chapter 5: Advanced PL/SQL Programming

description

Test the Slide Share

Transcript of Db Triggers05ch

Page 1: Db Triggers05ch

1

Enhanced Guide to Enhanced Guide to Oracle8iOracle8i

Chapter 5:Advanced PL/SQL Programming

Page 2: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

8

Parameter Modes IN

Incoming values, read-only OUT

Outgoing values, write-only IN OUT

Can be both incoming and outgoing

Page 9: Db Triggers05ch

9

Creating a Procedure CREATE OR REPLACE PROCEDURE procedure_name

(parameter1 mode datatype,

parameter2 mode datatype, …

) IS | AS

local variable declarations

BEGIN

program statements

EXCEPTION

exception handlers

END;

header

body

Page 10: Db Triggers05ch

10

Executing a Procedure EXECUTE procedure_name

(parameter1_value, parameter2_value, …);

Page 11: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

20

Procedure Builder Interface

ObjectNavigatorWindow

PL/SQLInterpreterWindow

commandpromptpane

sourcecodepane

Page 21: Db Triggers05ch

21

Program Unit Editor Interface

Button bar

ProcedurelistProcedure

template

Status line

Sourcecode pane

Page 22: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

25

Setting a Breakpoint Load program unit in PL/SQL

Interpreter window Double-click line to create

breakpoint

Breakpoint

Page 26: Db Triggers05ch

26

Viewing Program Variable Values During Execution

Variablevalues

Executionarrow

Page 27: Db Triggers05ch

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: Db Triggers05ch

28

Calling Procedures From Other Procedures

Use procedure name followed by parameter list

procedure_name

(parameter1_value, parameter2_value, …);

Page 29: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

34

Packages Server-side code library Can contain:

Global variable declarations Cursors Procedures Functions

Page 35: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

38

Creating a Package Specification in SQL*Plus

Page 39: Db Triggers05ch

39

Creating a Package Body in SQL*Plus

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

Page 40: Db Triggers05ch

40

Creating a Package Body in SQL*Plus

Page 41: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

43

Package Specification With Overloaded Procedures

Page 44: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

47

Creating Database Triggers Code is similar to all PL/SQL

program unit blocks Database triggers cannot accept

parameters

Page 48: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

51

Creating a Trigger in SQL*PlusCREATE OR REPLACE TRIGGER trigger_name

[BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON

table_name

[FOR EACH ROW] [WHEN (condition)]

BEGIN

trigger body

END;

Page 52: Db Triggers05ch

52

Creating a Statement-Level Trigger in SQL*Plus

Page 53: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

55

Creating a Row-Level Trigger in SQL*Plus

Page 56: Db Triggers05ch

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: Db Triggers05ch

57

Specifying Trigger Properties in Procedure Builder

Timing

Statementtype

Triggername

Field

WHENcondition

Triggerbody

Level

Page 58: Db Triggers05ch

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: Db Triggers05ch

59

Creating an INSTEAD-OF Trigger in SQL*Plus

Page 60: Db Triggers05ch

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: Db Triggers05ch

61

Oracle Built-In Packages Provide support for basic database

functions Owned by the SYS database

schema

Page 62: Db Triggers05ch

62

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

administration Internal support

Page 63: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

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: Db Triggers05ch

70

Creating Dynamic SQL Programs that Contain DML Commands

1. Open the cursor that defines the memory area where processing is performed

2. Define the SQL command as a text string, using placeholders for dynamic values

3. Parse the SQL command4. Bind input variables to placeholders5. Execute the SQL command6. Close the cursor

Page 71: Db Triggers05ch

71

Creating Dynamic SQL Programs that Contain DDL Commands

1. 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: Db Triggers05ch

72

Creating Dynamic SQL Programs that Contain SELECT Commands

1. 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: Db Triggers05ch

73

Using Dynamic SQL to Create an Anonymous PL/SQL Block

1. 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