Oracle PL/SQL

CONTENTS
PL/SQL.......................................................................................................................................................... 3 INTRODUCTION TO PL/SQL...................................................................................................................... 4 Topics ..................................................................................................................................................... 4 New Features in PL/SQL........................................................................................................................ 5 PL/SQL Architecture .............................................................................................................................. 6 PL/SQL Block Structure ......................................................................................................................... 7 PL/SQL Data Types................................................................................................................................ 8 Declaring Variables and Constants...................................................................................................... 10 Conditional Control Statements ........................................................................................................... 12 Iterative Control Statements................................................................................................................. 12 Loop Labels .......................................................................................................................................... 13 Sequential Control: GOTO and NULL Statements............................................................................... 13 SQL Support in PL/SQL ....................................................................................................................... 15 User-Defined Records .......................................................................................................................... 16 Review Questions.................................................................................................................................. 18 CURSORS .................................................................................................................................................. 19 Topics ................................................................................................................................................... 19 What are Cursors? ............................................................................................................................... 20 Explicit Cursors.................................................................................................................................... 20 Cursor Attributes .................................................................................................................................. 22 Cursor FOR Loops ............................................................................................................................... 23 Passing Parameters to Cursors ............................................................................................................ 24 Using Cursor Variables........................................................................................................................ 25 Review Questions.................................................................................................................................. 29 Exercises............................................................................................................................................... 29 PROCESSING TRANSACTIONS IN PL/SQL ............................................................................................... 30 Topics ................................................................................................................................................... 30 Processing Transactions....................................................................................................................... 31 Overriding Default Locking.................................................................................................................. 33 ERROR HANDLING IN PL/SQL................................................................................................................ 35 Topics ................................................................................................................................................... 35 Exceptions ............................................................................................................................................ 36 Scope Rules........................................................................................................................................... 38 Using EXCEPTION_INIT..................................................................................................................... 39 Propagation of Exception..................................................................................................................... 39 Re-raising an Exception ....................................................................................................................... 40 SQLCODE and SQLERRM .................................................................................................................. 41 Review Questions.................................................................................................................................. 44 Exercises............................................................................................................................................... 44 SUBPROGRAMS AND PACKAGES .............................................................................................................. 46 Topics ................................................................................................................................................... 46 What are Subprograms?....................................................................................................................... 47 Procedures............................................................................................................................................ 48 Functions .............................................................................................................................................. 49 Declaring Subprograms ....................................................................................................................... 50 Stored Subprograms ............................................................................................................................. 51 Positional and Named Notation ........................................................................................................... 52 Overloading.......................................................................................................................................... 52 Recursion.............................................................................................................................................. 54 Packages............................................................................................................................................... 54 Package STANDARD ........................................................................................................................... 57

Jayashree

Page 1 of 69

Oracle PL/SQL

ORACLE Product-specific Packages ................................................................................................... 57 Advantages of Packages ....................................................................................................................... 58 Exercises............................................................................................................................................... 59 DATABASE TRIGGERS .............................................................................................................................. 60 Topics ................................................................................................................................................... 60 Introduction to Triggers ....................................................................................................................... 61 Creating a Database Trigger ............................................................................................................... 61 Triggers Examples................................................................................................................................ 63 INSTEAD OF Triggers ......................................................................................................................... 66 Trigger Execution................................................................................................................................. 68 Exercises............................................................................................................................................... 69

Jayashree

Page 2 of 69

Oracle PL/SQL

PL/SQL

• • • • • •

Introduction to PL/SQL Cursors Processing Transactions in PL/SQL Error Handling in PL/SQL : Exceptions Subprograms and Packages Database Triggers

Jayashree

Page 3 of 69

Oracle PL/SQL Introduction to PL/SQL Topics • • • • • • • • • • New Features in PL/SQL PL/SQL Architecture PL/SQL Block Structure PL/SQL Data Types Declaring Variables and Constants Conditional Control Statements Iterative Control Statements Loop Labels Sequential Control : GOTO and NULL Statements SQL Support in PL/SQL Jayashree Page 4 of 69 .

external procedures are used to interface with embedded systems. • • Jayashree Page 5 of 69 . or control real-time devices and processes. registered with PL/SQL. and object orientation. which map directly into classes defined in object-oriented languages such as C++. Each object stores different real-world values. you create an abstract template for some real-world object. An object type encapsulates a data structure along with the functions and procedures needed to manipulate the data. exception handling. and so brings state-of-the-art programming to the Oracle Server and Toolset. PL/SQL provides an interface for calling routines written in other languages. solve scientific and engineering problems. An external procedure is a third-generation-language routine stored in a dynamic link library (DLL). PL/SQL offers modern software engineering features such as data encapsulation. and reusable. At run time. You can create as many objects as you need. New Features in PL/SQL • • • • External Procedures Object Types Collections LOB Types External Procedures • To support special-purpose processing and promote reuse of code. At run time. the standard data access language for object-relational databases. In. reduce complexity by breaking down a large system into logical entities. when the data structure is filled with values. then calls the routine as if it were a PL/SQL subprogram. PL/SQL. and called by you to do special-purpose processing. objects are instances of object types. This makes the strengths and capabilities of those languages available to you.Oracle PL/SQL PL/SQL is Oracle Corporation's procedural language extension to SQL. analyze data. information hiding. you have created an object. Typically. This allows you to create software components that are modular. • Object Types • Object-oriented programming is based on the concept of interacting objects. PL/SQL loads the library dynamically. maintainable. Object types. When you define an object type using the CREATE TYPE statement (in SQL*Plus for example).

The engine can be installed in an Oracle Server or in an application development tool such as Oracle Forms or Oracle Reports. PL/SQL operates on LOBs through the locators. can be attributes of an object type. This technology acts as an engine that executes PL/SQL blocks and subprograms. Collections work like the arrays found in most third-generation programming languages. • Jayashree Page 6 of 69 . conversely. called locators. you use the supplied package DBMS_LOB. So. not an independent product. and NCLOB let you store blocks of unstructured data up to four gigabytes in size. So. piece-wise access to the data. PL/SQL can reside in two environments: the Oracle Server Oracle tools • • • • The PL/SQL Engine • The PL/SQL engine executes procedural statements but sends SQL statements to the SQL Statement Executor in the Oracle Server. • PL/SQL Architecture • The PL/SQL runtime system is a technology.Oracle PL/SQL Collections • The collection types TABLE and VARRAY allow you to declare nested tables and variable-size arrays (varrays for short). And. BLOB. collections can be passed as parameters. random. Application development tools that lack a local PL/SQL engine must rely on Oracle to process PL/SQL blocks and subprograms. Also. To manipulate LOBs. they allow efficient. Each element has a unique subscript that determines its position in the collection. that specify the location of large objects stored out-of-line or in an external file. • LOB Types • The LOB (large object) datatypes BFILE. They can store instances of an object type and. you can use them to move columns of data into and out of database tables or between client-side applications and stored subprograms. A collection is an ordered group of elements. CLOB. LOB types store values. all of the same type.

A block (or sub-block) lets you group logically related declarations and statements. The Oracle Server passes the blocks and subprograms to its local PL/SQL engine. functions. which can contain any number of nested sub-blocks.the basic units (procedures.Oracle PL/SQL • When it contains the PL/SQL engine. an Oracle Server can process PL/SQL blocks and subprograms as well as single SQL statements. • • • Jayashree Page 7 of 69 . The declarations are local to the block and cease to exist when the block completes. Only the executable part is required. PL/SQL Engine Non-SQL SQL Procedural Statement Executor PL/SQL Block PL/SQL Block SQL Statement Executor ORACLE Server PL/SQL Block Structure DECLARE < Declarations > BEGIN < Executable Statements > EXCEPTION < Exception Handlers > END. You can nest sub-blocks in the executable and exception-handling parts of a PL/SQL block or subprogram but not in the declarative part. • PL/SQL is a block-structured language . and anonymous blocks) that make up a PL/SQL program are logical blocks.

called pointers. called locators. A composite type has internal components that can be manipulated individually. constraints. and valid range of values. A subtype associates a base type with a constraint and so defines a subset of values. PL/SQL provides a variety of predefined datatypes. that designate other program items. Scalar Types BINARY_INTEGER DEC DECIMAL DOUBLE-PRECISION INTEGER FLOAT INT INTEGER NATURAL NUMBER NUMERIC POSITIVE REAL SMALLINT SIGNTYPE Composite Types RECORD TABLE Reference Types REFCURSOR REF object_name LOB Types BFILE BLOB CLOB Subtypes A base type is the datatype from which a subtype is derived. which specifies a storage format. A LOB type holds values. CHAR CHARACTER LONG LONG RAW RAW ROWID STRING VARCHAR2 DATE BOOLEAN Jayashree Page 8 of 69 . A scalar type has no internal components. that specify the location of large objects (graphic images for example) stored out-of-line.Oracle PL/SQL PL/SQL Data Types Every constant and variable has a datatype. A reference type holds values.

SUBTYPE EmpRoster IS NameList. -. -. subprogram. SUBTYPE Time IS TimeRec. For example: DECLARE SUBTYPE Accumulator IS NUMBER(7.-. -.empno%TYPE.Oracle PL/SQL BINARY_INTEGER NATURAL POSITIVE SIGNTYPE NUMBER DEC DECIMAL DEC DOUBLE PRECISION INTEGER INT NUMERIC REAL SMALLINT CHAR CHARACTER VARCHAR2 STRING VARCHAR User-Defined Subtypes You can define your own subtypes in the declarative part of any PL/SQL block. SUBTYPE Word IS VARCHAR2(15). Examples: DECLARE SUBTYPE EmpDate IS DATE. -.illegal. SUBTYPE DeptFile IS c1%ROWTYPE.2). SUBTYPE Word IS temp%TYPE.based on TABLE type TYPE TimeRec IS RECORD (minutes INTEGER.based on column type CURSOR c1 IS SELECT * FROM dept.maximum size of Word is 15 Jayashree Page 9 of 69 . -.based on NATURAL subtype TYPE NameList IS TABLE OF VARCHAR2(10). -. hours INTEGER).--based on cursor rowtype However. -. SUBTYPE Delimiter IS CHAR(1). -. you cannot specify a constraint on the base type.based on DATE type SUBTYPE Counter IS NATURAL.illegal You can use a simple workaround to define size-constrained subtypes indirectly: DECLARE temp VARCHAR2(15). or package using the syntax SUBTYPE subtype_name IS base_type.illegal.based on RECORD type SUBTYPE ID_Num IS emp.

00. and NUMBER. • • • • • • • Jayashree Page 10 of 69 . such as CHAR. you can declare items of that type. employees Counter. Declaring Variables and Constants • PL/SQL allows you to declare variables and constants. Examples: DECLARE SUBTYPE Counter IS NATURAL. DATE. DECLARE SUBTYPE Accumulator IS NUMBER. and then use them in SQL and procedural statements anywhere an expression can be used. Example: credit_limit CONSTANT REAL := 5000.Oracle PL/SQL Using Subtypes Once you define a subtype. Examples: emp_no NUMBER(4). Variables can have any SQL data type. including other declarative statements. or any PL/SQL data type. Examples: blood_type CHAR DEFAULT 'O'. Constants are declared by specifying the key word CONSTANT before the datatype. You can use the keyword DEFAULT instead of the assignment operator to initialize variables. rows Counter. in_stock BOOLEAN. total Accumulator(7. as the following example shows: acct_id INTEGER(4) NOT NULL := 9999. Forward references are not allowed. Example: deptno NUMBER(4) := 10. declarations can impose the NOT NULL constraint. such as BOOLEAN and BINARY_INTEGER. Initial values can also be assigned to a variable at the time of declaration. So. valid BOOLEAN DEFAULT FALSE. you must declare a variable or constant before referencing it in other statements. Besides assigning an initial value. The NOT NULL constraint must be followed by an initialization clause.2).

The record can store an entire row of data selected from the table Example : emp_rec emp%ROWTYPE.Oracle PL/SQL Using %TYPE Attribute • The %TYPE attribute provides the data type of a variable or database column.2). • Using %TYPE to declare my_dname has two advantages. Example : my_dname scott. if the database definition of dname changes. Using %ROWTYPE Attribute • The %ROWTYPE attribute provides a record type that represents a row in a table (or view).dept.dname%TYPE. Second.deptno • • • Jayashree Page 11 of 69 . To reference a field.00. Columns in a row and corresponding fields in a record have the same names and data types. you might reference the deptno field as emp_rec. you need not know the exact data type of dname. balance NUMBER(7. you use dot notation. • The %TYPE attribute is particularly useful when declaring variables that refer to database columns. the data type of my_dname changes accordingly at run time. minimum_balance balance%TYPE := 10. Examples : credit REAL(7.2). debit credit%TYPE. First. For example.

Jayashree Page 12 of 69 . END IF. ELSE sequence_of_statements3. WHILE condition LOOP sequence_of_statements. END LOOP. END LOOP. END LOOP. IF condition1 THEN sequence_of_statements1. Iterative Control Statements LOOP sequence_of_statements. END IF.Oracle PL/SQL Conditional Control Statements IF condition THEN sequence_of_statements. EXIT. ELSE sequence_of_statements2.higher_bound LOOP sequence_of_statements. ELSIF condition2 THEN sequence_of_statements2. END IF.. FOR counter IN [REVERSE] lower_bound. IF condition THEN sequence_of_statements1. EXIT WHEN condition.

as the following example shows: <<my_loop>> LOOP . an undeclared identifier enclosed by double angle brackets... • With either form of EXIT statement... The label.. EXIT outer WHEN .. as follows: <<outer>> LOOP . • Optionally. must appear at the beginning of the LOOP statement.. END LOOP. use the label in an EXIT statement. but any enclosing loop. The label must be unique within its scope and must precede an executable statement or a PL/SQL block. Jayashree Page 13 of 69 . LOOP . you can complete not only the current loop. loops can be labeled. as follows: <<label_name>> LOOP sequence_of_statements..exit both loops Sequential Control: GOTO and NULL Statements • • The GOTO statement branches to a label unconditionally. the label name can also appear at the end of the LOOP statement.Oracle PL/SQL Loop Labels • Like PL/SQL blocks. END LOOP. END LOOP outer. .. Simply label the enclosing loop that you want to complete. Then. END LOOP my_loop. -..

.. Restrictions on using GO TO • • • A GOTO statement cannot branch into an IF statement. <<end_loop>> NULL.. END IF.. • DECLARE my_ename CHAR(10).. END. FOR i IN 1.branch to enclosing block END. Also... <<insert_row>> INSERT INTO emp VALUES ... -. or subblock.. END... A GOTO statement cannot branch from an enclosing block into a sub-block Jayashree Page 14 of 69 . GOTO insert_row. BEGIN .. • DECLARE done BEGIN BOOLEAN. END. . ..50 LOOP IF done THEN GOTO end_loop..an executable statement END LOOP. <<get_name>> SELECT ename INTO my_ename FROM emp WHERE . BEGIN . . . LOOP statement. GOTO get_name...Oracle PL/SQL GOTO Statement : Examples • BEGIN . a GOTO statement cannot branch from one IF statement clause to another.. -..

. amount REAL)IS BEGIN NULL. DELETE. however. However. a GOTO statement can branch from an exception handler into an enclosing block. A stub is dummy subprogram that allows you to defer the definition of a procedure or function until you test and debug the main program. STDDEV. MAX. • Example : PROCEDURE debit_account(acct_id INTEGER. LEVEL. ROWNUM all comparison. SQL Support in PL/SQL Data Manipulation Transaction Control SQL Functions SQL Pseudocolumns SQL Operators INSERT. ROWID. ROLLBACK. COMMIT.. It can. and row operators Jayashree Page 15 of 69 . COUNT. WHEN OTHERS THEN NULL. it does nothing other than pass control to the next statement. SUM. • The NULL statement is a handy way to create stubs when designing applications from the top down. END. END debit_account. SAVEPOINT. set. VARIANCE CURRVAL. SELECT. LOCK TABLE COMMIT. NEXTVAL. improve readability. UPDATE. WHEN VALUE_ERROR THEN INSERT INTO errors VALUES .Oracle PL/SQL • A GOTO statement cannot branch from an exception handler into the current block. The NULL Statement • The NULL statement explicitly specifies inaction. MIN. SET TRANSACTION AVG. Example : EXCEPTION WHEN ZERO_DIVIDE THEN ROLLBACK.

Even if the fields match exactly. Declaring Records : records must be declared in two steps .. then declare user-defined records of that type. • • • • User-Defined Records : Example TYPE deptrectype IS RECORD ( deptno dept..deptno%TYPE.dname%TYPE. dname dept. Records cannot be tested for equality.loc%TYPE ). where field_type stands for the following syntax: {datatype_name | variable%TYPE | record_variable%TYPE | table.field_name Fields declared as NOT NULL must be initialized. inequality. loc dept.first. records of different types cannot be assigned to each other. deptrec deptrectype.). define a RECORD type. . Jayashree Page 16 of 69 . A user-defined record and a %ROWTYPE record always have different data types You cannot use the INSERT statement to insert user-defined records into a database table. field_name2 field_type [NOT NULL {:= | DEFAULT} expr]. Defining a RECORD type : TYPE type_name IS RECORD ( field_name1 field_type [NOT NULL {:= | DEFAULT} expr]. or nullity.Oracle PL/SQL User-Defined Records • • The user can define logically related variables into a composite data type as records. use dot notation record_name.column%TYPE | table%ROWTYPE | cursor%ROWTYPE | cursor_variable%ROWTYPE} • • • To reference individual fields in a record.

TYPE FlightRec IS RECORD ( flight_no INTEGER. and other records (called nested records). salary REAL(7. dname. -. DECLARE TYPE TimeRec IS RECORD ( seconds SMALLINT.deptno := …. dept_num INTEGER(2). -. Jayashree Page 17 of 69 . -.Oracle PL/SQL To store data into deptrec : SELECT deptno.declare object passengers PassengerList. DECLARE TYPE EmpRec IS RECORD ( emp_id INTEGER last_name VARCHAR2(15).. minutes SMALLINT. collections.declare nested record airport_code VARCHAR2(10)).declare varray depart_time TimeRec. FUNCTION nth_highest_salary (n INTEGER) RETURN EmpRec IS . hours SMALLINT).. object types cannot have attributes of type RECORD. job_title VARCHAR2(15). loc INTO deptrec FROM dept WHERE deptno = 10. PL/SQL lets you define records that contain objects. plane_id VARCHAR2(10). However. To reference a field in deptrec : deptrec. You can specify a RECORD type in the RETURN clause of a function specification.2)).. .. captain Employee.

2. (T / F) 5. as both are made up of columns/fields. A loop label or block label should be declared in the DECLARE section. The user can define logically related variables into a composite data type as __________________________ Jayashree Page 18 of 69 . (T / F) 3. A PL/SQL table is similar to a base table. (T / F) 7.Oracle PL/SQL Review Questions 1. The PL/SQL statement which helps in creating the stubs is _____________________ 6. ________________________________________ statement allows for breaking out of a loop unconditionally. (T /F) 4. Initialization of variables cannot be done in the DECLARE part of a PL/SQL block. 8. _______________________________ attribute can be used in PL/SQL to declare a variable to be of the same type as another variable or a table column. prior to its use in the body of the block. Nesting of blocks is allowed in any portion of a PL/SQL block.

Oracle PL/SQL Cursors Topics • • • • • • What are Cursors? Explicit Cursors Cursor Attributes Cursor FOR Loops Passing Parameters to Cursors Using Cursor Variables Jayashree Page 19 of 69 .

subprogram. There are two kinds of cursors: implicit and explicit. For queries that return more than one row. Example : DECLARE CURSOR c1 IS SELECT ename. including queries that return only one row. or multiple rows. you can explicitly declare a cursor to process the rows. or package. you name it and associate it with a specific query. you can explicitly declare a cursor to process the rows individually. A PL/SQL construct called a cursor lets you name a work area and access its stored information. depending on how many rows meet your search criteria. Syntax : CURSOR cursor-name IS select-statement. You can declare a cursor in the declarative part of any PL/SQL block. PL/SQL implicitly declares a cursor for all SQL data manipulation statements.Oracle PL/SQL What are Cursors? • • Oracle uses work areas to execute SQL statements and store processing information. When a query returns multiple rows. sal FROM emp WHERE deptno = 10. Jayashree Page 20 of 69 . one. You can use three commands to control a cursor: • OPEN • FETCH • CLOSE • • • Declaring a cursor : • • • When you declare a cursor. • • • Explicit Cursors • The set of rows returned by a query can consist of zero.

Example : CLOSE c1.Oracle PL/SQL Opening a Cursor : • Opening the cursor executes the query and identifies the active set. Example : OPEN c1. • • • Closing a Cursor : • • • • The CLOSE statement disables the cursor. Syntax : CLOSE cursor-name. Jayashree Page 21 of 69 . Also. and the active set becomes undefined. Syntax : FETCH cursor-name INTO variables. the cursor advances to the next row in the active set. Once a cursor is closed. For each column value returned by the query associated with the cursor. which consists of all rows that meet the query search criteria. you can reopen it. After each fetch. their data types must be compatible. • • Fetching with a Cursor : • The FETCH statement retrieves the rows in the active set one at a time. For cursors declared using the FOR UPDATE clause. Syntax : OPEN cursor-name. my_sal. the OPEN statement also locks those rows. Example : FETCH c1 INTO my_ename. there must be a corresponding variable in the INTO list. Any other operation on a closed cursor raises the predefined exception INVALID_CURSOR.

PL/SQL raises the predefined exception TOO_MANY_ROWS and %ROWCOUNT yields 1. When appended to the cursor or cursor variable. Is true if DML statement was not successful Is true if DML statement was successful Returns number of rows affected by a DML statement Is always false because ORACLE automatically closes an implicit cursor after executing its SQL statement SQL%NOTFOUND SQL%FOUND SQL%ROWCOUNT SQL%ISOPEN • If a SELECT INTO statement returns more than one row. . %ISOPEN %NOTFOUND. Jayashree Page 22 of 69 . DELETE. Evaluates to true. not the actual number of rows that satisfy the query. no more rows left Evaluates to true. these attributes return useful information about the execution of a data manipulation statement.e. i. if last fetch failed. if last fetch succeeded Returns the number of rows fetched Evaluates to true.Oracle PL/SQL Cursor Attributes Explicit Cursor Attributes • Each cursor or cursor variable has four attributes: %FOUND. or SELECT INTO statement. if the cursor is open • %NOTFOUND %FOUND %ROWCOUNT %ISOPEN Implicit Cursor Attributes • Implicit cursor attributes return information about the execution of an INSERT. UPDATE. and %ROWCOUNT.

var_sal emp. you can simplify coding by using a cursor FOR loop instead of the OPEN. dbms_output. sal FROM emp. Cursor FOR Loops • • In most situations that require an explicit cursor. LOOP FETCH c1 INTO var_empno.sal%type. and CLOSE statements. END LOOP.empno%type. A cursor FOR loop implicitly declares its loop index as a %ROWTYPE record. CLOSE c1. FETCH. • Jayashree Page 23 of 69 .put_line procedure: SQL> SET SERVEROUTPUT ON 2. END LOOP. END IF. IF var_sal > 1000 THEN var_sal := var_sal + 100. Syntax : FOR index IN cursor-name LOOP statements. opens a cursor. BEGIN OPEN c1. CURSOR c1 IS SELECT empno.column_name. Note: 1. Using ‘WHERE CURRENT OF <cursor-name>’ in the above example speeds up the update since the condition is the same as the select. EXIT WHEN c1%NOTFOUND. END. COMMIT. and closes the cursor when all rows have been processed. repeatedly fetches rows of values from the active set into fields in the record. DECLARE var_empno emp.Oracle PL/SQL Example: Update the salaries of all employees by 100 if the current salary is more than 1000. var_sal. The individual values of the fields of the row in the record can be referenced by the dot notation: index. UPDATE emp SET sal = var_sal WHERE empno = var_empno. Execute the following SQL*PLUS command prior to the use of dbms_output.put_line(‘Salary updated for’ ||var_empno).

DECLARE CURSOR emp_cursor(dnum NUMBER) IS SELECT sal.sal + emp_record. total_wages := total_wages + emp_record. COMMIT. high_paid NUMBER(4) := 0. END LOOP. END LOOP. IF emp_record.sal THEN higher_comm := higher_comm + 1. Example : In the following example. total_wages NUMBER(11.2) := 0. you pass a department number. END IF.comm. Also. CURSOR c1 IS SELECT n1.n2 / (c1rec.sal > 2000. higher_comm NUMBER(4) := 0. 0). Note: Using the COMMIT inside the loop closes the cursor.col1%TYPE.00 THEN high_paid := high_paid + 1. NULL. END.comm. Avoid it.n1 + c1rec. you determine how many employees have salaries higher than $2000 and how many have commissions larger than their salaries. comm FROM emp WHERE deptno = dnum.comm > emp_record.comm := NVL(emp_record. Passing Parameters to Cursors • • You can pass parameters to the cursor used in a cursor FOR loop. NULL). Jayashree Page 24 of 69 . BEGIN FOR c1rec IN c1 LOOP /* calculate and store the results */ result := c1rec. IF emp_record. END IF. Then.Oracle PL/SQL • Example : Cursor FOR Loop DECLARE result temp.n3). BEGIN FOR emp_record IN emp_cursor(20) LOOP emp_record. INSERT INTO temp VALUES (result. you compute the total wages paid to employees in that department. n3 FROM data_table WHERE exper_num = 1. n2.

declaring a cursor variable creates a pointer. First.weak Jayashree Page 25 of 69 .Oracle PL/SQL INSERT INTO temp VALUES (high_paid. a cursor variable is dynamic because it is not tied to a specific query.declare cursor variable -. Whereas a cursor is static. which hold the memory location (address) of some item instead of the item itself. you take two steps. 'Total Wages: ' || TO_CHAR(total_wages)). higher_comm. So. COMMIT. Syntax for defining: TYPE ref_type_name IS REF CURSOR RETURN return_type. then declare cursor variables of that type. But. Using Cursor Variables • Like a cursor. not an item. you can assign new values to a cursor variable and pass it as a parameter to subprograms. Examples: DECLARE TYPE DeptCurTyp IS REF CURSOR RETURN dept%ROWTYPE. A cursor variable has datatype REF CURSOR. -. This gives you an easy way to centralize data retrieval. you define a REF CURSOR type.strong TYPE GenericCurTyp IS REF CURSOR. dept_cv DeptCurTyp. • • Defining REF CURSOR Types To create cursor variables. Also. Cursor variables are like C or Pascal pointers. This gives you more flexibility. a cursor variable points to the current row in the result set of a multirow query. DECLARE TYPE EmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE. Declaring Cursor Variables DECLARE TYPE DeptCurTyp IS REF CURSOR RETURN dept%ROWTYPE. You can open a cursor variable for any type-compatible query. -. END. cursors differ from cursor variables the way constants differ from variables. including subprograms stored in an Oracle database.

• Cursor variables do not take parameters • The query cannot be FOR UPDATE Examples: IF NOT emp_cv%ISOPEN THEN /* Open cursor variable. The statement syntax is OPEN {cursor_variable_name | :host_cursor_variable_name} FOR select_statement. emp_cv EmpCurTyp. Controlling Cursor Variables: You use three statements to control a cursor variable: OPEN-FOR. CREATE PACKAGE emp_data AS . TYPE EmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE. and CLOSE.Oracle PL/SQL DECLARE TYPE TmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE. -.. PROCEDURE open_emp_cv (emp_cv IN OUT EmpCurTyp). Jayashree Page 26 of 69 . ename VARCHAR2(1O). */ OPEN emp_cv FOR SELECT * FROM emp.declare cursor variable TYPE EmpCurTyp IS REF CURSOR RETURN tmp_cv%ROWTYPE. END IF. You need not close a cursor variable before reopening it. END emp_data.declare cursor variable DECLARE TYPE EmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE.2)). When you reopen a cursor variable for a different query. sal NUMBER(7. -. FETCH.. PROCEDURE open_emp_cv (emp_cv IN OUT EmpCurTyp) IS ... emp_cv EmpCurTyp.declare cursor variable DECLARE TYPE EmpRecTyp IS RECORD ( empno NUMBER(4). TYPE EmpCurTyp IS REF CURSOR RETURN EmpRecTyp. and identifies the result set. executes the query. Opening a Cursor Variable The OPEN-FOR statement associates a cursor variable with a multi-row query. Note: Other OPEN-FOR statements can open the same cursor variable for different queries. the previous query is lost. tmp_cv TmpCurTyp. -.

Fetching from a Cursor Variable The FETCH statement retrieves rows one at a time from the result set of a multi-row query. END open_emp_cv.Oracle PL/SQL CREATE PACKAGE BODY emp_data AS . TYPE EmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE. PROCEDURE open_emp_cv (emp_cv IN OUT EmpCurTyp) IS BEGIN OPEN emp_cv FOR SELECT * FROM emp. PROCEDURE open_emp_cv (emp_cv IN OUT EmpCurTyp. sal > 2500. the associated result set is undefined. Closing a Cursor Variable The CLOSE statement disables a cursor variable. deptno = 20. CREATE PACKAGE BODY emp_data AS PROCEDURE open_emp_cv (emp_cv IN choice IN BEGIN IF choice = 1 THEN OPEN emp_cv FOR SELECT * FROM emp WHERE ELSIF choice = 2 THEN OPEN emp_cv FOR SELECT * FROM emp WHERE ELSIF choice = 3 THEN OPEN emp_cv FOR SELECT * FROM emp WHERE END IF. END emp_data.. Jayashree Page 27 of 69 . The statement syntax follows: FETCH {cursor_variable_name | :host_cursor_variable_name} INTO {variable_name[. END emp_data. END emp_data. After that. NUMBER) IS comm IS NOT NULL.. | record_name}. choice IN NUMBER).. OUT EmpCurTyp. Example CREATE PACKAGE emp_data AS TYPE GenericCurTyp IS REF CURSOR. The statement syntax follows: CLOSE {cursor_variable_name | :host_cursor_variable_name). END open_emp_cv. variable_name]..

END. loc FROM emp. :cv) Jayashree Page 28 of 69 .get_staff(20. dname. TYPE EmpCurTyp IS REF CURSOR RETURN EmpRecTyp. PROCEDURE get_staff (dept_no IN NUMBER. emp_name CHAR(10).deptno ORDER BY empno. job_title CHAR(9). END.Oracle PL/SQL Example: Using a bind variable CREATE PACKAGE emp_data AS TYPE EmpRecTyp IS RECORD ( emp_id NUMBER(4). emp_cv IN OUT EmpCurTyp) IS BEGIN OPEN emp_cv FOR SELECT empno.deptno = dept_no AND emp. ename. / CREATE PACKAGE BODY emp_data AS PROCEDURE get_staff (dept_no IN NUMBER. dept_name CHAR(14).deptno = dept. emp_cv IN OUT EmpCurTyp). job. dept_loc CHAR(13)). END. / COLUMN EMPNO HEADING Number COLUMN ENAME HEADING Name COLUMN JOB HEADING JobTitle COLUMN DNAME HEADING Department COLUMN LOC HEADING Location SET AUTOPRINT ON VARIABLE cv REFCURSOR EXECUTE emp_data. dept WHERE emp.

(T / F) 6. Consider two tables having a column each of numbers. Write these increments in a separate table. The PL/SQL statement that executes the query associated with a cursor is _____________________________________________ 5. The name of the implicit cursor is _______________________________________ 7. You can use the _______________________________________________ packaged procedure to output something to the screen.Oracle PL/SQL Review Questions 1. The SELECT statement used in a PL/SQL block need not necessarily have an INTO clause always. Write an anonymus PL/SQL block that retrieves the five highest paid employees from the EMP table. In the EMP table. give a raise in sal of 10% to all clerks. then insert the sum of the rows into a third table. Get a number from each of the two tables. Stop when all rows have been fetched from either of the two tables. 2. 2. as well as update in the EMP table. The two kinds of cursors are _____________________________________________ 3. PL/SQL implicitly declares a cursor for all DML statements. and 20% to all salesmen. including queries that return multiple rows. Jayashree Page 29 of 69 . 3. (T / F) 4. The explicit cursor attribute which evaluates to true if the last fetch succeeded is _______________________________________________________ Exercises 1.

Oracle PL/SQL Processing Transactions in PL/SQL Topics • • Processing Transactions Overriding Default Locking – – Using the FOR UPDATE Clause Using the LOCK TABLE Command Jayashree Page 30 of 69 .

other users cannot access the changed data. Thus.Oracle PL/SQL Processing Transactions • When a table is being queried by one user and updated by another at the same time. You need never explicitly lock a resource because default locking mechanisms protect Oracle data and structures. The COMMIT statement ends the current transaction and makes permanent any changes made during that transaction. The COMMIT and ROLLBACK statements ensure that all database changes brought about by SQL operations are either made permanent or undone at the same time. once a query begins and as it proceeds. that is. That is. they see the data as it was before you made the changes. • • • • • • Jayashree Page 31 of 69 . You can choose from several modes of locking such as row share and exclusive. Thus. the data read by the query does not change. Oracle uses locks to control concurrent access to data. the next SQL statement automatically begins another transaction. Oracle uses information in the rollback segment to build read-consistent query results and to undo changes if necessary. Until you commit the changes. Oracle generates a read-consistent view of the data for the query. the database is automatically restored to its former state. As update activity continues. All the SQL statements executed since the last commit or rollback make up the current transaction. A transaction is a series of one or more logically related SQL statements that accomplish a task. Oracle treats the series of SQL statements as a unit so that all the changes brought about by the statements are either committed (made permanent) or rolled back (undone) at the same time. However. It also erases any savepoints marked since the last commit or rollback. every SQL statement is part of a transaction. The COMMIT statement releases all row and table locks. The first SQL statement in your program begins a transaction. you can request data locks on tables or rows when it is to your advantage to override default locking. Oracle is transaction oriented. A lock gives you temporary ownership of a database resource such as a table or row of data. data cannot be changed by other users until you finish with it. When one transaction ends. it uses transactions to ensure data integrity. If your program fails in the middle of a transaction. Oracle takes snapshots of the table's data and records changes in a rollback segment.

PL/SQL does not roll back database work done by the subprogram. if you make a mistake like deleting the wrong row from a table.. BEGIN SELECT empno. . PL/SQL does not assign values to OUT parameters.... Example: DECLARE emp_id INTEGER. .). INTO emp_id.. a rollback lets you return to the starting point to take corrective action and perhaps try again.. FROM new_emp WHERE ... Rolling back is useful for two reasons. • • • • Jayashree Page 32 of 69 . Used with the ROLLBACK TO statement. if you start a transaction that you cannot finish because an exception is raised or a SQL statement fails. . .. INSERT INTO tax VALUES (emp_id. Oracle rolls back to the savepoint. Second. the savepoint to which you roll back is not erased. If you exit a stored subprogram with an unhandled exception. • SAVEPOINT names and marks the current point in the processing of a transaction. or DELETE statement. EXCEPTION WHEN DUP_VAL_ON_INDEX THEN ROLLBACK..). INSERT INTO emp VALUES (emp_id.. The number of active savepoints per session is unlimited. However.. . .. . a rollback restores the original data. . First. When you roll back to a savepoint... INSERT INTO pay VALUES (emp_id. If the statement fails. END. any savepoints marked after that savepoint are erased. savepoints let you undo parts of a transaction instead of the whole transaction..Oracle PL/SQL • The ROLLBACK statement ends the current transaction and undoes any changes made during that transaction.. Implicit Rollbacks : Before executing an INSERT. Oracle marks an implicit savepoint (unavailable to you). UPDATE. Also.)..

.. In that case. you cannot fetch from a FOR UPDATE cursor after a commit. use the FOR UPDATE clause only if you want to lock the rows before the update or delete.. you can use the FOR UPDATE clause to confine row locking to particular tables. You can explicitly lock entire tables using the LOCK TABLE statement. DELETE FROM emp WHERE . WHERE empno = emp_id. However. Overriding Default Locking • With the SELECT FOR UPDATE statement. So. • The FOR UPDATE clause identifies the rows that will be updated or deleted. Rows in a table are locked only if the FOR UPDATE OF clause refers to a column in that table. SAVEPOINT do_insert.empno%TYPE. So... Oracle automatically obtains row-level locks at update or delete time. When querying multiple tables. EXCEPTION WHEN DUP_VAL_ON_INDEX THEN ROLLBACK TO do_insert. you can explicitly lock specific rows of a table to make sure they do not change before an update or delete is executed. sal FROM emp WHERE job = 'SALESMAN' AND comm > sal FOR UPDATE..). then locks each row in the active set. you must make sure that the row is not changed by another user before the update. UPDATE emp SET . not as they are fetched. • • Jayashree Page 33 of 69 .. All rows are locked when you open the cursor. END. INSERT INTO emp VALUES (emp_id. BEGIN .. The rows are unlocked when you commit or roll back the transaction.... This is useful when you want to base an update on the existing values in a row. • Using the FOR UPDATE Clause DECLARE CURSOR c1 IS SELECT empno. .Oracle PL/SQL Example: DECLARE emp_id emp.

. and a query never acquires a table lock.. Using the LOCK TABLE Command • The LOCK TABLE statement can be used to lock entire database tables in a specified lock mode so that you can share or deny access to them. LOOP FETCH c1 INTO . A table lock never keeps other users from querying a table.. the statement below locks the emp table in row share mode. END LOOP.deptno FOR UPDATE OF sal. • Jayashree Page 34 of 69 . LOCK TABLE emp IN ROW SHARE MODE NOWAIT. The optional keyword NOWAIT tells Oracle not to wait. UPDATE emp SET sal = new_sal WHERE CURRENT OF c1.Oracle PL/SQL • Example : DECLARE CURSOR c1 IS SELECT ename. . ... Only if two different transactions try to modify the same row will one transaction wait for the other to complete. if the table has been locked by another user. job.. dname FROM emp. sal FROM emp FOR UPDATE.. dept WHERE emp. Using the CURRENT OF clause You can use the CURRENT OF clause in UPDATE or DELETE statement to refer to the latest row fetched from a cursor : DECLARE CURSOR c1 IS SELECT empno. BEGIN OPEN c1. sal. Row share locks allow concurrent access to a table.deptno = dept. they prevent other users from locking the entire table for exclusive use. . END.. For example. Table locks are released when your transaction issues a commit or rollback.

Oracle PL/SQL Error Handling in PL/SQL Topics • • • • • • Exceptions Scope Rules Using EXCEPTION_INIT Propagation of Exception Re-raising an Exception SQLCODE and SQLERRM Jayashree Page 35 of 69 .

you try to assign values to the attributes of an uninitialized (atomically null) object. So. you try an illegal cursor operation such as closing an unopened cursor. the convertion of character string to a number fails because the character string does not represent a valid number. the current block stops executing and the enclosing block resumes with the next statement.Oracle PL/SQL Exceptions • In PL/SQL. in a SQL statement.. When an error occurs. After an exception handler runs. an exception is raised. Internal exceptions are raised implicitly (automatically) by the runtime system. • • • • • Pre-Defined Exceptions Exception ACCESS_INTO_NULL COLLECTION_IS_NULL Raised when . you write separate routines called exception handlers. User-defined exceptions must be raised explicitly by RAISE statements. You must close a cursor before you can reopen it. or you try to assign values to the elements of an uninitialized nested table or varray. If there is no enclosing block. you try to open an already open cursor. VALUE_ERROR is raised. A cursor FOR loop automatically opens the cursor to which it refers. To handle raised exceptions. you try to store duplicate values in a database column that is constrained by a unique index. you you try to apply collection methods other than EXISTS to an uninitialized (atomically null) nested table or varray. normal execution stops and the control transfers to the exception-handling part of your PL/SQL block or subprogram. you cannot open that cursor inside the loop. Exceptions can be internally defined (by the runtime system) or user defined.. In procedural statements. a warning or error condition is called an exception. That is. which can also raise predefined exceptions. control returns to the host environment. CURSOR_ALREADY_OPEN DUP_VAL_ON_INDEX INVALID_CURSOR INVALID_NUMBER Jayashree Page 36 of 69 .

when you select a column value into a character variable. an arithmetic. you reference a nested table or varray element using an index number that is outside the legal range (-1 for example). SQL group functions such as AVG and SUM always return a value or a null. The FETCH statement is expected to return no rows eventually. INVALID_NUMBER is raised. so when that happens. you reference a nested table or varray element using an index number larger than the number of elements in the collection. you try to divide a number by zero. no exception is raised. a timeout occurs while Oracle is waiting for a resource. or sizeconstraint error occurs.Oracle PL/SQL LOGIN_DENIED NO_DATA_FOUND NOT_LOGGED_ON PROGRAM_ERROR ROWTYPE_MISMATCH STORAGE_ERROR SUBSCRIPT_BEYOND_COUNT SUBSCRIPT_OUTSIDE_LIMIT TIMEOUT_ON_RESOURCE TOO_MANY_ROWS VALUE_ERROR ZERO_DIVIDE you try logging on to Oracle with an invalid username and/or password. when you pass an open host cursor variable to a stored subprogram. a SELECT INTO statement returns no rows. Jayashree Page 37 of 69 . For example. the return types of the actual and formal parameters must be compatible. a SELECT INTO statement returns more than one row. VALUE_ERROR is raised if the conversion of a character string to a number fails. truncation. PL/SQL runs out of memory or memory is corrupted. your PL/SQL program issues a database call without being connected to Oracle. a SELECT INTO statement that calls a group function will never raise NO_DATA_FOUND. the host cursor variable and PL/SQL cursor variable involved in an assignment have incompatible return types. or you reference a deleted element in a nested table. For example. or you reference an uninitialized element in an index-by table. So. In procedural statements. if the value is longer than the declared length of the variable. In SQL statements. conversion. PL/SQL aborts the assignment and raises VALUE_ERROR. PL/SQL has an internal problem.

2. however. … EXCEPTION WHEN out_of_stock THEN /* Exception Handling END.Oracle PL/SQL User-Defined Exceptions : Example : DECLARE out_of_stock EXCEPTION.. Scope Rules • You cannot declare an exception twice in the same block. If you redeclare a global exception in a sub-block. . BEGIN .. the local declaration prevails. -.. in which case the following syntax is valid: block_label. So. code */ Example : DECLARE acct_type INTEGER.. q_o_h NUMBER(5). Because a block can reference only local or global exceptions.. Exceptions declared in a block are considered local to that block and global to all its sub-blocks.raise predefined exception END IF.exception_name • • Jayashree Page 38 of 69 . 3) THEN RAISE INVALID_NUMBER. .. IF acct_type NOT IN (1. enclosing blocks cannot reference exceptions declared in a sub-block. END. declare the same exception in two different blocks. the sub-block cannot reference the global exception unless it was declared in a labeled block. You can. END IF. EXCEPTION WHEN INVALID_NUMBER THEN ROLLBACK. … BEGIN … IF q_o_h < 1 THEN RAISE out_of_stock.

if PL/SQL cannot find a handler for it in the current block or subprogram. You can code the pragma EXCEPTION_INIT in the declarative part of a PL/SQL block. In PL/SQL.Oracle PL/SQL Using EXCEPTION_INIT • To handle unnamed internal exceptions..handle the error . subprogram. In the latter case. -60). which can be thought of as a parenthetical remark to the compiler. the pragma EXCEPTION_INIT tells the compiler to associate an exception name with an Oracle error number. PL/SQL returns an unhandled exception error to the host environment. A pragma is a compiler directive. That is.. or package using the syntax • • PRAGMA EXCEPTION_INIT(exception_name. not at run time.. where exception_name is the name of a previously declared exception. Oracle_error_number).. PRAGMA EXCEPTION_INIT(deadlock_detected. That allows you to refer to any internal exception by name and to write a specific handler for it. END. you must use the OTHERS handler or the pragma EXCEPTION_INIT. Example: DECLARE deadlock_detected EXCEPTION. Propagation of Exception • When an exception is raised. BEGIN . Jayashree Page 39 of 69 . Pragmas (also called pseudoinstructions) are processed at compile time. the exception reproduces itself in successive enclosing blocks until a handler is found or there are no more blocks to search. the exception propagates. EXCEPTION WHEN deadlock_detected THEN -.

enclosing blocks cannot reference exceptions declared in a sub-block. To re raise an exception... END IF. then log the error in an enclosing block.Oracle PL/SQL • An exception can propagate beyond its scope. DECLARE ---------. you might want to roll back a transaction in the current block. Example : BEGIN . Re-raising an Exception • Sometimes. END. ------------. that is. beyond the block in which it was declared. then pass it to an enclosing block. handle it locally.. BEGIN . END... simply place a RAISE statement in the local handler without an exception name. IF .sub-block ends EXCEPTION . • Jayashree Page 40 of 69 . But. it propagates to the enclosing block.. only an OTHERS handler can catch the exception. So.sub-block begins past_due EXCEPTION.. you want to re raise an exception. For example. THEN RAISE past_due. that is.. according to the scope rules. • Because the block in which it was declared has no handler for the exception named past_due. WHEN OTHERS THEN ROLLBACK.

. SQLCODE returns the number of the Oracle error. -. For user-defined exceptions. BEGIN . SQLCODE returns zero and SQLERRM returns the message : ORA-0000: normal.. you can use the functions SQLCODE and SQLERRM to find out which error occurred and to get the associated error message. The message begins with the Oracle error code.handle the error RAISE. in which case SQLCODE returns +100. -..Oracle PL/SQL DECLARE out_of_balance EXCEPTION.reraise the current exception .. EXCEPTION WHEN out_of_balance THEN -.raise the exception END IF. SQLERRM returns the corresponding error message.. SQLCODE returns +1 and SQLERRM returns the message User-Defined Exception If no exception has been raised.handle the error differently . The number that SQLCODE returns is negative unless the Oracle error is no data found. For internal exceptions. successful completion • • • Jayashree Page 41 of 69 . THEN RAISE out_of_balance... END.sub-block ends EXCEPTION WHEN out_of_balance THEN -. END.. BEGIN ---------. -----------. IF ..sub-block begins .. SQLCODE and SQLERRM • In an exception handler.

err_msg := SUBSTR(SQLERRM. END LOOP. DECLARE err_msg VARCHAR2(100). Instead. BEGIN .itno. WHEN OTHERS THEN err_num := SQLCODE. You cannot use SQLCODE or SQLERRM directly in a SQL statement. then use the variables in the SQL statement.. Jayashree Page 42 of 69 . in which case SQLERRM returns the message associated with that error number. /* Get all Oracle error messages. err_msg VARCHAR2(100).. INSERT INTO errors VALUES (err_msg).. 1. Make sure you pass negative error numbers to SQLERRM... trandate. END... BEGIN . • Example: To update the ITEMMAST table using the ITTRAN table DECLARE CURSOR t1 IS SELECT itno. INSERT INTO errors VALUES (err_num. 100).. BEGIN FOR tran IN t1 LOOP /* inner block */ DECLARE out_of_stock EXCEPTION.. qty FROM ittran WHERE upper(updt) = ‘N’ ORDER BY itno.Oracle PL/SQL • You can pass an error number to SQLERRM. BEGIN SELECT qoh INTO var_qoh FROM itemmast WHERE itno = tran. as the following example shows: DECLARE err_num NUMBER.9999 LOOP err_msg := SQLERRM(-err_num). . var_qoh itemmast. */ FOR err_num IN 1. trantype. you must assign their values to local variables. EXCEPTION .qoh%TYPE := 0.err_msg). END.

tran.Oracle PL/SQL IF tran. tran. END.trandate.itno.qty.qty WHERE itno = tran.tran.trantype = ‘I’ THEN IF tran.qty > var_qoh THEN RAISE out_of_stock. tran.qty WHERE itno = tran. ‘out of stock’ ).qty.trantype.‘invalid item number’).trandate.itno. END IF.itno. Jayashree Page 43 of 69 . UPDATE ittran SET updt = ‘Y’ WHERE itno = tran. tran. END IF. tran. ELSE UPDATE itemmast SET qoh = qoh + tran.trantype. /* FOR loop */ /* main block */ END. WHEN no_data_found THEN INSERT INTO errortab VALUES (tran.itno. ELSE UPDATE itemmast SET qoh = qoh .itno. /* inner block */ END LOOP. EXCEPTION WHEN out_of_stock THEN INSERT INTO errortab VALUES (tran. tran.

The exception handler which can catch any kind of exception raised is called ___________________________ 7. You can use an explicit GO TO statement in the exception handling part of a PL/SQL block to go back to the statement following the one which raised the exception. Record all invalid transactions in another table. To get the error message of an error. The internal exception DUP_VAL_ON_INDEX means ______________________ ___________________________________________________________________ 5. Internal exceptions cannot be raised by the RAISE statement.Oracle PL/SQL Review Questions 1. Consider the following tables : ITEMMAST ITNO NAME QOH (Quantity on hand) CLASS (Category) UOM (Unit of measurement) ROL (Re-order level) ROQ (Re-order quantity) RATE ITTRAN ITEMNO TRANTYPE TRANQTY TRANDATE UPDT Update the itemmast table using the ittran table. The internal exception TOO_MANY_ROWS is raised when __________________ ___________________________________________________________________ 6. Jayashree Page 44 of 69 . (T / F) 2. A routine that is used to handle raised exceptions is called ____________________ ______________________________________ 3. you can use the function ___________________ Exercises 1.(T / F) 4.

an amount by which to update the account. or delete). Each row in the action table contains an account number. On an insert. On a delete. On an update.Oracle PL/SQL 2. U. it is created by an insert. if the account does not exist. if the account already exists. Jayashree Page 45 of 69 . an update is done instead. no action is taken. or D for insert. if the row does not exist. an action to be taken (I. and a time tag used to sequence the transactions. In each case the status is written into the action table. Suppose there are the two tables : ACCOUNTS Account_id 1 2 3 4 5 Balance 1000 2000 1500 6500 500 ACTION Account_id 3 6 5 7 1 9 10 Oper_type u i d u I d x New_value 599 20099 1599 399 Status Time_tag 12-DEC-97 12-DEC-97 12-DEC-97 12-DEC-97 12-DEC-97 12-DEC-97 12-DEC-97 Accounts table is modified according to instructions stored in the action table. update.

Oracle PL/SQL Subprograms and Packages Topics • • • • • • • • • • • • What are Subprograms? Procedures Functions Declaring Subprograms Stored Subprograms Positional and Named Notation Overloading Recursion Packages Package STANDARD Product-Specific Packages Advantages of Packages Jayashree Page 46 of 69 .

. new_balance REAL.procedures . amount REAL) IS old_balance REAL. control execution. These objects are local and cease to exist when you exit the subprogram. The exception-handling part contains exception handlers.. and nested subprograms. END debit_account. variables. PL/SQL has two types of subprograms . ELSE UPDATE accts SET bal = new_balance WHERE acctno = acct_id. new_balance := old_balance . EXCEPTION WHEN overdrawn THEN . and an optional exceptionhandling part. exceptions.Oracle PL/SQL What are Subprograms? • Subprograms are named PL/SQL blocks that can take parameters and can be invoked. Jayashree Page 47 of 69 .amount. cursors. constants. and manipulate Oracle data. END IF. Subprograms have a declarative part. you use a procedure to perform an action and a function to compute a value. overdrawn EXCEPTION. IF new_balance < 0 THEN RAISE overdrawn.functions Generally. The declarative part contains declarations of types. • • • • • • Subprograms : Example PROCEDURE debit_account (acct_id INTEGER. which deal with exceptions raised during execution. an executable part. The executable part contains statements that assign values. BEGIN SELECT bal INTO old_balance FROM accts WHERE acctno = acct_id.

where parameter stands for the following syntax: parameter_name [IN|OUT|IN OUT] datatype [{:=|DEFAULT} expr] • You cannot specify a constraint on the datatype. BEGIN SELECT sal INTO current_salary FROM emp WHERE empno = emp_id.])] IS [local declarations] BEGIN executable statements [EXCEPTION exception handlers] END [name]..Oracle PL/SQL Procedures Syntax : PROCEDURE name [(parameter[. Jayashree Page 48 of 69 . Example : Procedure PROCEDURE raise_salary (emp_id INTEGER. salary_missing EXCEPTION. increase REAL) IS current_salary REAL. 'No such number'). ELSE UPDATE emp SET sal = sal + increase WHERE empno = emp_id.. parameter. . EXCEPTION WHEN NO_DATA_FOUND THEN INSERT INTO emp_audit VALUES (emp_id. IF current_salary IS NULL THEN RAISE salary_missing. WHEN salary_missing THEN INSERT INTO emp_audit VALUES (emp_id. END IF. 'Salary is null'). END raise_salary.

Inside the subprogram. END sal_ok. IN parameters can be initialized to default values. BEGIN SELECT losal. you cannot specify a constraint on the data type. max_sal REAL. an IN OUT parameter acts like an initialized variable. • OUT Mode : An OUT parameter lets you return values to the caller of a subprogram. Therefore.])] RETURN datatype IS [local declarations] BEGIN executable statements [EXCEPTION exception handlers] END [name]. Inside the subprogram.. hisal INTO min_sal. title CHAR) RETURN BOOLEAN IS min_sal REAL. parameter. Therefore. it cannot be assigned a value. Inside the subprogram. an OUT parameter acts like an uninitialized variable. IN OUT Mode : An IN OUT parameter lets you pass initial values to the subprogram being called and return updated values to the caller. . max_sal FROM sals WHERE job = title. Therefore. an IN parameter acts like a constant..Oracle PL/SQL Functions Syntax : FUNCTION name [(parameter[. • Jayashree Page 49 of 69 . Parameter Modes • IN Mode : An IN parameter lets you pass values to the subprogram being called. it can be assigned a value and its value can be assigned to another variable. where parameter stands for the following syntax: parameter_name [IN | OUT | IN OUT] datatype [{:= | DEFAULT} expr] Note. Example : Function The following function determines if an employee salary is out of range: FUNCTION sal_ok (salary REAL. RETURN (salary >= min_sal) AND (salary <= max_sal). its value cannot be assigned to another variable or reassigned to itself.

) IS BEGIN .. CURSOR c1 IS SELECT * FROM emp. -. Forward Declarations :You can use forward declarations to .define mutually recursive subprograms ..) BEGIN . PL/SQL requires that you declare an identifier before using it.define subprograms in logical or alphabetical order . ). you must declare a subprogram before calling it.. ). END.. DECLARE rating NUMBER... END... • • • Jayashree Page 50 of 69 . .. PROCEDURE calc_rating ( . you must declare subprograms at the end of a declarative section after all other program objects. /* Define subprograms in alphabetical order.. or package. Therefore. ) IS BEGIN calc_rating( ....forward declaration ..Oracle PL/SQL Declaring Subprograms • You can declare subprograms in any PL/SQL block...group subprograms in a package A forward declaration consists of a subprogram specification terminated by a semicolon.. END. PROCEDURE award_bonus (.. subprogram. */ PROCEDURE award_bonus ( . However. DECLARE PROCEDURE calc_rating ( .

iss_qty WHERE itno = iss_item. you use the CREATE PROCEDURE and CREATE FUNCTION statements. it is good programming practice to use different names for actual and formal parameters. • • • Jayashree Page 51 of 69 . When you call procedure raise_salary. END. Example : CREATE OR REPLACE PROCEDURE issue_qty ( iss_item itemmast. Though not necessary.Oracle PL/SQL Stored Subprograms • To create subprograms and store them permanently in an Oracle database. the actual parameters are evaluated and the result values are assigned to the corresponding formal parameters. COMMIT. The variables declared in a subprogram specification and referenced in the subprogram body are formal parameters. iss_qty NUMBER) AS BEGIN UPDATE itemmast SET qoh = qoh . which you can execute interactively from SQL*Plus. 100 ) Actual and Formal Parameters • • Subprograms pass information using the parameters. or can be executed directly at the SQL*PLUS prompt using the EXECUTE command : SQL> EXECUTE issue_qty ( 6. • The stored subprograms can be either called from a PL/SQL program or other subprogram.itno%TYPE. The variables or expressions referenced in the parameter list of a subprogram call are actual parameters.

That is.credit(amount => amt. END initialize. n INTEGER) IS BEGIN FOR i IN 1. amount => amt). PROCEDURE credit (acctno INTEGER.mixed notation • Overloading • PL/SQL lets you overload subprogram names.positional notation . -. amt REAL. you can indicate the association between an actual and formal parameter by position or name. Jayashree Page 52 of 69 . hiredate_tab DateTabTyp. -.credit(acct. END.. -.n LOOP tab(i) := SYSDATE.. TYPE RealTabTyp IS TABLE OF REAL INDEX BY BINARY_INTEGER.credit(acctno => acct. END LOOP. you can call the procedure credit in four logically equivalent ways: . order. you can use the same name for several different subprograms as long as their formal parameters differ in number. Example : DECLARE acct INTEGER. acctno => acct). Example Suppose you want to initialize the first n rows in two index-by tables that were declared as follows: DECLARE TYPE DateTabTyp IS TABLE OF DATE INDEX BY BINARY_INTEGER. Procedure to initialize the index-by table named hiredate_tab: PROCEDURE initialize (tab OUT DateTabTyp. -.named notation . amt).credit(acct. amount => amt).named notation . sal_tab RealTabTyp. or data type family.. amount REAL) IS BEGIN .Oracle PL/SQL Positional and Named Notation • When calling a subprogram.

TYPE RealTabTyp IS TABLE OF REAL INDEX BY BINARY_INTEGER. • Only local or packaged subprograms can be overloaded. indx BINARY_INTEGER.n LOOP tab(i) := 0.. DECLARE TYPE DateTabTyp IS TABLE OF DATE INDEX BY BINARY_INTEGER.. -. n INTEGER) IS BEGIN FOR i IN 1. initialize(hiredate_tab. Likewise.0. PL/SQL determines which of the two procedures is being called by checking their formal parameters.calls first version initialize(comm_tab.Oracle PL/SQL Procedure to initialize the index-by table named sal_tab: PROCEDURE initialize (tab OUT RealTabTyp. • • • Jayashree Page 53 of 69 .calls second version .. BEGIN indx := 50. or package. indx). you cannot overload two subprograms if their formal parameters differ only in subtype and the different subtypes are based on types in the same family.. you cannot overload standalone subprograms. END. . subprogram. Therefore. END LOOP. indx). -. Finally. hiredate_tab DateTabTyp. comm_tab RealTabTyp. You cannot overload two subprograms if their formal parameters differ only in data type and the different data types are in the same family.. you cannot overload two functions that differ only in return type (the data type of the result value) even if the types are in different families. Also. you cannot overload two subprograms if their formal parameters differ only in name or parameter mode. You can place the two overloaded initialize procedures in the same block. END initialize.

or nested. The body fully defines cursors and subprograms. Example : FUNCTION fac (n POSITIVE) RETURN INTEGER IS -. variables.Oracle PL/SQL Recursion • PL/SQL supports recursive subprograms . a specification and a body.returns n! BEGIN IF n = 1 THEN -. which you can execute interactively from SQL*PLUS : • • • • • CREATE PACKAGE name AS -. END fac.terminating condition RETURN 1. The specification is the interface to your applications. parameterized. and subprograms available for use. objects.1). constants. it declares the types. you use the CREATE PACKAGE and CREATE PACKAGE BODY statements.recursive call END IF.subprogram specifications END [name]. -. To create packages and store them permanently in an Oracle database. and subprograms. cursors. Packages • A package is a database object that groups logically related PL/SQL types. packages cannot be called. Jayashree Page 54 of 69 . and so implements the specification.public type and object declarations -. ELSE RETURN n * fac(n . exceptions. Unlike subprograms. although sometimes the body is unnecessary. Packages usually have two parts.specification (visible part) -.

END emp_actions. deptno NUMBER).body (hidden part) -. Jayashree Page 55 of 69 .specification TYPE EmpRecTyp IS RECORD(emp_id INTEGER. You can debug. • Application Package Database Specificatio Body Example : Package CREATE PACKAGE emp_actions AS -. comm NUMBER. sal NUMBER. CURSOR desc_salary RETURN EmpRecTyp.subprogram bodies [BEGIN -.private type and object declarations -. job VARCHAR2. Package Interface • The specification holds public declarations.initialization statements] END [name]. The body holds implementation details and private declarations.Oracle PL/SQL CREATE PACKAGE BODY name AS -. or replace a package body without changing the interface (package specification) to the package body. which are hidden from your application. enhance. salary REAL). which are visible to your application. PROCEDURE hire_employee ( ename VARCHAR2. PROCEDURE fire_employee (emp_id NUMBER). mgr NUMBER.

package_name.object_name .body CURSOR desc_salary RETURN EmpRecTyp IS SELECT empno. and subprograms declared within a package specification. a stored subprogram. sal FROM emp ORDER BY sal DESC. END emp_actions. sal. as follows: . SYSDATE. END hire_employee.type_name . comm NUMBER. • Jayashree Page 56 of 69 . mgr. deptno NUMBER) IS BEGIN INSERT INTO emp VALUES (empno_seq. objects. you use dot notation.Oracle PL/SQL CREATE PACKAGE BODY emp_actions AS -. mgr NUMBER. sal NUMBER. deptno).NEXTVAL. ename. comm. or an Oracle tool such as SQL*Plus.package_name. PROCEDURE hire_employee ( ename VARCHAR2. PROCEDURE fire_employee (emp_id NUMBER) IS BEGIN DELETE FROM emp WHERE empno = emp_id.package_name. Referencing Package Contents • To reference the types. END fire_employee. job VARCHAR2.subprogram_name You can reference package contents from a database trigger. job.

FUNCTION TO_CHAR (left NUMBER) RETURN VARCHAR2. a procedure named raise_application_error lets you issue user-defined error messages. If you redeclare ABS in a PL/SQL program. exceptions. However. package STANDARD contains the following declarations: FUNCTION TO_CHAR (right DATE) RETURN VARCHAR2. which makes it easier to test and debug them. they operate independently of any timing mechanism). as follows: .ABS(x) . Package DBMS_OUTPUT : enables you to display output from PL/SQL blocks and subprograms. package STANDARD declares the following built-in function named ABS.. The alerts are transaction based and asynchronous (that is.. That way. you can still call the built-in function by using dot notation. right VARCHAR2) RETURN VARCHAR2. which are available automatically to every PL/SQL program. FUNCTION TO_CHAR (left DATE. which returns the absolute value of its argument: FUNCTION ABS (n NUMBER) RETURN NUMBER. your local declaration overrides the global declaration. For example.Oracle PL/SQL Package STANDARD A package named STANDARD defines the PL/SQL environment. For instance.. You display the information by calling the procedure get_line or by using the command SET SERVEROUTPUT ON in SQL*Plus. Package DBMS_ALERT : lets you use database triggers to alert an application when specific database values change. Package DBMS_SQL : allows PL/SQL to execute SQL data definition and data manipulation statements dynamically at run time. STANDARD. The put_line procedure outputs information to a buffer in the SGA. you can report errors to an application and avoid returning unhandled exceptions. FUNCTION TO_CHAR (left NUMBER. Most built-in functions are overloaded. For example. • • • Jayashree Page 57 of 69 . and subprograms.. ORACLE Product-specific Packages • Package DBMS_STANDARD : provides language facilities that help your application interact with Oracle. right VARCHAR2) RETURN VARCHAR2. The package specification globally declares types.

Oracle PL/SQL

Package DBMS_PIPE: allows different sessions to communicate over named pipes. (A pipe is an area of memory used by one process to pass information to another.) You can use the procedures pack_message and send_message to pack a message into a pipe, then send it to another session in the same instance. At the other end of the pipe, you can use the procedures receive_message and unpack_message to receive and unpack (read) the message. Named pipes are useful in many ways. For example, you can write routines in C that allow external servers to collect information, then send it through pipes to procedures stored in an Oracle database.

Package UTL_FILE: allows your PL/SQL programs to read and write operating system (OS) text files. It provides a restricted version of standard OS stream file I/O, including open, put, get, and close operations. When you want to read or write a text file, you call the function fopen, which returns a file handle for use in subsequent procedure calls. For example, the procedure put_line writes a text string and line terminator to an open file. The procedure get_line reads a line of text from an open file into an output buffer.

Package UTL_HTTP: allows your PL/SQL programs to make hypertext transfer protocol (HTTP) callouts. You can use it to retrieve data from the internet, or to call Oracle Web Server cartidges. The package has two entry points, each of which accepts a URL (universal resource locator) string, contacts the specified site, and returns the requested data, which is usually in hypertext markup language (HTML) format.

Advantages of Packages
Modularity : Packages let you encapsulate logically related types, objects, and subprograms in a named PL/SQL module. Each package is easy to understand, and the interfaces between packages are simple, clear, and well defined. Easier Application Design : When designing an application, you can code and compile a specification without its body. Once the specification has been compiled, stored subprograms that reference the package can be compiled as well. Information Hiding : With packages, you can specify which types, objects, and subprograms are public (visible and accessible) or private (hidden and inaccessible). For example, if a package contains four subprograms, three might be public and one private. The package hides the definition of the private subprogram so that only the package (not your application) is affected if the definition changes. This simplifies maintenance and enhancement. Also, by hiding implementation details from users, you protect the integrity of the package.

Jayashree

Page 58 of 69

Oracle PL/SQL

Added Functionality : Packaged public variables and cursors persist for the duration of a session. So, they can be shared by all subprograms that execute in the environment. Also, they allow you to maintain data across transactions without having to store it in the database. Better Performance : When you call a packaged subprogram for the first time, the whole package is loaded into memory. Therefore, subsequent calls to related subprograms in the package require no disk I/O.

Exercises
1. Create a function to return an employee’s bonus that is based on his salary and department to which he belongs. If he belongs to department 10 and is not a clerk or salesman, then he receives 4% bonus on his salary. If he belongs to department 10 and is a clerk or salesman, then he receives 5% bonus on his salary. All others receive 6% of salary as bonus. Test this function at the SQL*PLUS prompt using the command EXECUTE. 2. Create a procedure that accepts an argument n, and determines the top n employees with respect to salary. The procedure should display the ename and sal of these employees, as well as record the results in a table called TOP_SAL. Call this procedure from a PL/SQL block, or test it at the SQL*PLUS prompt using the command EXECUTE. 3. Create a PL/SQL block that calls a recursive function fact to compute and display the factorials of !..n numbers. 4. Create procedures for the following (refer to the ITEMMAST table): a) Item issue updation b) Item receipt updation c) Adding a new item Execute these procedures with the EXECUTE command.

Jayashree

Page 59 of 69

Oracle PL/SQL

Database Triggers
Topics
• • • • • Introduction to Triggers Creating a Database Trigger Triggers Examples INSTEAD OF Triggers Trigger Execution

Jayashree

Page 60 of 69

enforce referential integrity across nodes in a distributed database . For example. ON table [REFERENCING {OLD [AS] old | NEW [AS] new}] [FOR EACH ROW] [WHEN (condition)] PL/SQL Block Jayashree Page 61 of 69 . and that is implicitly executed when an INSERT.gather statistics on table access • • Creating a Database Trigger CREATE [OR REPLACE] TRIGGER trigger-name [BEFORE | AFTER] {DELETE|INSERT|UPDATE [OF column [.prevent invalid transactions .maintain synchronous table replicates . UPDATE.provide sophisticated auditing . A trigger could also restrict DML operations to occur only at certain times during weekdays. a trigger can restrict DML operations against a table to those issued during regular business hours.. Oracle automatically executes a trigger when a specified SQL statement is issued against the table. Triggers can supplement the standard capabilities of Oracle to provide a highly customized database management system. column]…} [OR {DELETE|INSERT|UPDATE [OF column [.provide transparent event logging . or DELETE statement is issued against the associated table..enforce complex business rules .automatically generate derived column values .column]…}]. Other uses for triggers are to: .enforce complex security authorizations .Oracle PL/SQL Introduction to Triggers • A database trigger is a stored PL/SQL procedure that is associated with a table.

The trigger restriction contains a SQL condition that must be satisfied for Oracle to fire the trigger. The triggering statement is one that modifies this table. REFERENCING : specifies correlation names.Oracle PL/SQL Parts of a Trigger • Triggering statement : DELETE. If your row trigger is associated with a table named OLD or NEW. updates or deletes With FOR EACH ROW option ORACLE fires the trigger before modifying each row affected by the triggering statement ORACLE fires the trigger after modifying each row affected by the triggering statement BEFORE Option ORACLE fires the trigger only once. The default correlation names are OLD and NEW.The definition of the triggering statement specifies what SQL statements cause Oracle to fire the trigger. INSERT. UPDATE . You can use correlation names in the PL/SQL block and WHEN clause of a row trigger to refer specifically to old and new values of the current row. You can specify this condition with the WHEN clause. Types of Triggers Row-Level Triggers Statement-Level Triggers BEFORE and AFTER Triggers execute once for each row in a transaction execute once for each transaction executed immediately before or after inserts. If this condition is satisfied. after executing the triggering statement AFTER Option Jayashree Page 62 of 69 . then Oracle fires the trigger using the trigger action. Trigger action : The trigger action specifies the PL/SQL block Oracle executes to fire the trigger. Trigger restriction : The trigger restriction specifies an additional condition that must be satisfied for a row trigger to be fired. you can use this clause to specify different correlation names to avoid confusion between the table name and the correlation name. You must also specify the table with which the trigger is associated. • • Oracle evaluates the condition of the trigger restriction whenever a triggering statement is issued. WHEN : specifies the trigger restriction. before executing the triggering statement ORACLE fires the trigger only once.

NUMBER. and the empno of the row deleted should be logged into another table del_history. END IF.sal > maxsal) THEN raise_application_error( -20601.empno). BEGIN /* Get the minimum and maximum salaries for the employee's job from the SAL_GUIDE table. Whenever there is a deletion of row(s) from the emp table. CREATE OR REPLACE TRIGGER del_check AFTER DELETE ON EMP FOR EACH ROW BEGIN INSERT INTO del_history VALUES (USER. END. job ON emp FOR EACH ROW WHEN (new.ename ). details regarding the user. :old. maxsal WHERE job = :new. 2. /* If the employee's salary is out of range */ /* then generate an error */ IF(:new. Jayashree Page 63 of 69 .job || ' for employee ' || :new. 'Salary ' || :new. To create a trigger for emp table to check the salary range.job <> 'PRESIDENT') DECLARE minsal maxsal NUMBER.Oracle PL/SQL Triggers Examples 1.job.sal || ' out of range for job ' || :new. */ SELECT min_sal. while inserting a value for sal column or updating the sal column of an existing employee : CREATE TRIGGER salary_check BEFORE INSERT OR UPDATE OF sal. max_sal FROM sal_guide INTO minsal. END.sal < minsal OR :new.

The example below contains a sample package and trigger that tracks this information by hour and type of action (for example. END. DROP TABLE stat_tab. ’HH:MI:SS’)). UPDATE. Record all the types of operations done on the emp table along with the time. ’HH:MI:SS’)). is initialized to zero by a BEFORE statement trigger. 4. Then it is increased each time the row trigger is executed. Suppose you have a table. END. TO_CHAR(SYSDATE. Jayashree Page 64 of 69 . ’HH:MI:SS’)). CREATE OR REPLACE PACKAGE stat IS rowcnt INTEGER. Finally the statistical information is saved in the table STAT_TAB by the AFTER statement trigger.Oracle PL/SQL 3.ename). END. uhour INTEGER). SAL. A global session variable. CREATE OR REPLACE TRIGGER upcase BEFORE INSERT OR UPDATE OF ename ON EMP FOR EACH ROW BEGIN :new.ename := UPPER(:new. and you want to know when the table is being accessed and the types of queries being issued. 5. or INSERT) on table SAL. END IF. STAT. ELSIF DELETING THEN INSERT INTO opn_history VALUES (‘DELETE’.ROWCNT. Ensure that the names of employees in the emp table are always in upper case. TO_CHAR(SYSDATE. CREATE OR REPLACE TRIGGER opn_check AFTER INSERT OR DELETE OR UPDATE ON EMP FOR EACH ROW BEGIN IF INSERTING THEN INSERT INTO opn_history VALUES (‘INSERT’. CREATE TABLE stat_tab(utype CHAR(8). TO_CHAR(SYSDATE. ELSIF UPDATING THEN INSERT INTO opn_history VALUES (‘UPDATE’. rowcnt INTEGER. DELETE.

rowcnt := stat. hour NUMBER. UPDATE stat_tab SET rowcnt = rowcnt + stat. END IF. CREATE TRIGGER at AFTER UPDATE OR DELETE OR INSERT ON sal DECLARE typ CHAR(8). Jayashree Page 65 of 69 . IF inserting THEN typ := 'insert'. END. BEGIN IF updating THEN typ := 'update'.rowcnt WHERE utype = typ AND uhour = hour.rowcnt.rowcnt + 1. END. END IF.rowcnt := 0.rowcnt WHERE utype = typ AND uhour = hour.Oracle PL/SQL CREATE TRIGGER bt BEFORE UPDATE OR DELETE OR INSERT ON sal BEGIN stat. END IF. IF SQL%ROWCOUNT = 0 THEN INSERT INTO stat_tab VALUES (typ. END. hour := TRUNC((SYSDATE .TRUNC(SYSDATE)) * 24). END IF. IF deleting THEN typ := 'delete'. CREATE TRIGGER rt BEFORE UPDATE OR DELETE OR INSERT ON sal FOR EACH ROW BEGIN stat. stat. hour). EXCEPTION WHEN dup_val_on_index THEN UPDATE stat_tab SET rowcnt = rowcnt + stat.

dept d. but modifying joins is inherently ambiguous. insert. Object views present additional problems. Jayashree Page 66 of 69 . p. By default.resp_dept.deptno. For example. e. there are many restrictions on which views are modifiable. These triggers are called INSTEAD OF triggers because.level. DELETE. • Deleting a row in a view could either mean deleting it from the base table or updating some column values so that it will no longer be selected by the view.empno.deptno = p. and DELETE).Oracle PL/SQL INSTEAD OF Triggers • INSTEAD OF triggers provide a transparent way of modifying views that cannot be modified directly through SQL DML statements (INSERT. and UPDATE statements against the view and the INSTEAD OF trigger works invisibly in the background to make the right actions take place. This inevitably involves joins.empno = d.dept_type. a key use of object views is to represent master/detail relationships. The trigger performs update. project p WHERE e. Oracle fires the trigger instead of executing the triggering statement. or delete operations directly on the underlying tables. • Inserting a row in a view could either mean inserting a new row into the base table or updating an existing row so that it will be projected by the view. d.projno FROM emp e. As a result of these ambiguities. UPDATE.mgr_no AND d. p. CREATE VIEW manager_info AS SELECT e. Example of an INSTEAD OF Trigger The following example shows an INSTEAD OF trigger for inserting rows into the MANAGER_INFO view. An INSTEAD OF trigger can be used on object views as well as relational views that are not otherwise modifiable. d. INSTEAD OF triggers are activated for each row. Users write normal INSERT.name. • Modifying Views Modifying views has inherent problems of ambiguity. unlike other types of triggers. • Updating a column in a view that involves joins might change the semantics of other columns that are not projected by the view.

:n. ELSE UPDATE emp SET emp. Jayashree Page 67 of 69 .level WHERE project.name WHERE emp. IF NOT EXISTS SELECT * FROM dept WHERE dept. END IF. :n.deptno = :n.dept_type WHERE dept. ELSE UPDATE project SET project.deptno.empno.deptno. ELSE UPDATE dept SET dept.new manager information FOR EACH ROW BEGIN IF NOT EXISTS SELECT * FROM emp WHERE emp.dept_type = :n.project_level).projno.name).empno = :n. IF NOT EXISTS SELECT * FROM project WHERE project.level = :n.empno.name = :n.Oracle PL/SQL CREATE TRIGGER manager_info_insert INSTEAD OF INSERT ON manager_info REFERENCING NEW AS n -.projno = :n. :n. END IF.projno THEN INSERT INTO project VALUES(:n.deptno THEN INSERT INTO dept VALUES(:n.empno = :n.projno.projno = :n.empno THEN INSERT INTO emp VALUES(:n.deptno = :n.dept_type). END. END IF.

Oracle PL/SQL Trigger Execution A trigger can be in either of two distinct modes: enabled An enabled trigger executes its trigger action if a triggering statement is issued and the trigger restriction (if any) evaluates to TRUE. if more than one trigger of the same type exists for a given statement Jayashree Page 68 of 69 . For enabled triggers. Oracle automatically • executes triggers of each type in a planned firing sequence when more than one trigger is fired by a single SQL statement • performs integrity constraint checking at a set point in time with respect to the different types of triggers and guarantees that triggers cannot compromise integrity constraints • provides read-consistent views for queries and constraints • manages the dependencies among triggers and objects referenced in the code of the trigger action • uses two-phase commit if a trigger updates remote tables in a distributed database • fires multiple triggers in an unspecified order. disabled A disabled trigger does not execute its trigger action. even if a triggering statement is issued and the trigger restriction (if any) would evaluate to TRUE.

If the receipt is more than the ROQ value. Jayashree Page 69 of 69 . 3.Oracle PL/SQL Exercises 1. INSERT INTO emp_dept VALUES (6. 2. c) Check the ROQ value in case of receipt of an item. Write a database trigger to automatically update the commission of employees in the EMP table who are salesmen. then the trigger should fire for a confirmation. 30. 6. ‘OPERATIONS’). Consider the two tables: EMP EMPNO DEPTNO 1 10 2 10 3 30 4 20 5 20 DEPT DEPTNO 10 20 30 40 DNAME SALES RESEARCH OPERATIONS PRODUCTION Create a view emp_dept on these two tables. b) Store the necessary details in a table called RE_ORD. in case the QOH goes below ROL for that item. Prevent users from modifying the EMP table at times other than between 8:30 am and 6:00 pm on week days. Create a trigger to make sure that the increase in salary for employees in the EMP table is only 10% of the previous salary. which will allow you to execute the following commands successfully: INSERT INTO emp_dept VALUES (4. Create a trigger to change the deptno in the EMP table whenever changes occur in the DEPT table. 5. 4. ‘SUPPORT’). that selects empno. ‘SUPPORT’). as newcomm = oldcomm * (newsal / oldsal). 50. and dname columns. deptno. Create database triggers to (refer to the ITEMMAST table) : a) Check the QOH column value before any issue is made. INSERT INTO emp_dept VALUES (7. 30. Write an INSTEAD OF trigger for insert.

Sign up to vote on this title
UsefulNot useful