ORACLE-PL-SQL (2)

Views:
 
     
 

Presentation Description

No description available.

Comments

By: playmanmughal (23 month(s) ago)

very goooooood bessst gooooooooood

By: fjrock (37 month(s) ago)

please download

Presentation Transcript

Slide 1:

Introduction to PL / SQL PL/SQL Oracle Center of Excellence

Slide 2:

PL/SQL Execution Environments The PL/SQL Engine PL/SQL BLOCK DECLARE Procedural Procedural BEGIN Procedural SQL Procedural SQL END; PL/SQL BLOCK DECLARE Procedural Procedural BEGIN Procedural SQL Procedural SQL END; PROCEDURAL STATEMENT EXECUTOR To the statement Executors in the ORACLE RDBMS

Slide 3:

DECLARE BEGIN EXCEPTION PL/SQL BLOCK STRUCTURE

Slide 4:

PL/SQL BLOCK STRUCTURE Declaration Section Executable Section Exception Handler Section Quick Note - Block structuring 1. Any block may contain sub-block.Sub-blocks may appear anywhere an executable statement may legally appear. 2.Statement end with a; 3.comments are preceded by -- or surrounded by /* */ Declared objects exist within a certain scope (addressed later in this course).

Slide 5:

Variable Declaration PL/SQL Oracle Center of Excellence

Slide 6:

Variable Declarations Overview Syntax of Declaration identifier [constant ] datatype [not null ] [:= plsql_expression ] ; Quick Notes- variable Declaration 1. The rules for identifiers are same as for SQL objects. 2. NOT NULL may be used to constrain a variable so that it cannot have NULL value 3. Only one identifier per line is allowed . For ex. DECLARE fristname lastname CHAR(20) ; - illegal DECLARE fristname CHAR(20) ; -legal lastname CHAR(20) ; - legal Oracle Center of Excellence

Slide 7:

Variable Declaration over Count NUMBER; revenue NUMBER (9,2); second_per_day CONSTANT NUMBER := 60 * 60* 24 ; running _total NUMBER (10,0) ;= 0; mid_initial CHAR; last_name CHAR(10) NOT NULL := ‘PEEBLES’; company_name CONSTANT CHAR(12) := ‘ORACLE’; anniversary DATE ;= ‘05-NOV-78’; project_complexion DATE; next_checkup DATE NOT NULL ;= ‘28-JUN-90’; over_budget BOOLEAN NOT NULL := FALSE; available BOOLEAN := NULL ; NUMBER CHAR DATE BOOLEAN Oracle Center of Excellence

Slide 8:

Attribute Declaration PL/SQL objects (such as variables and constants) and database objects(such as col. and tables )are associated with certain attributes. %TYPE attribute Ex. DECLARE books_printed NUMBER (6); books_sold books_printed%TYPE ; maiden_name emp.ename%TYPE ; %ROWTYPE attribute Ex. DECLARE dept_row dept%ROWTYPE ; Oracle Center of Excellence

Slide 9:

Variable Assignment PL/SQL Expressions consist of Variables, Constants, Literals, and Function Calls. Operation ASSIGNMENT Syntax plsql_variable := plsql_expression ; Quick notes -Assignment 1 . := (ASSIGNMENT )= (VALUE EQUALITY) 2 . The datatype of the left and right hand side of an assignment must be the same or implicitly convertible to each other. For ex . , N:=‘7’ is legal because number may be implicitly converted to char. 3 .Column or table reference are not allowed or either side of an either side of an assignment operator( : = ). SCOTT.EMP.EMPNO := 1234; location := dept.loc.; These are illegal Oracle Center of Excellence

Slide 10:

Scoping Variables and Constants. SCOPE refers to he visibility of identifiers at different points in the PL /SQL block. SCOPING RULES: 1. An identifier is visible in the block in which it is declared and all its sub-blocks unless rule #2 applies. 2. If an identifier in an enclosing block is redeclared in a sub-block, the original identifier declared in the enclosing block is no longer visible in the sub-block .However, the newly declared identifier has the rules of scope defined in rule #1. Oracle Center of Excellence

Slide 11:

DECLARE credit_limit CONSTANT NUMBER (6,2) : =2000; account NUMBER; BEGIN DECLARE account CHAR(10); new_balance NUMBER (9,2); BEGIN new_balance account credit_limit END; DECLARE account CHAR(10); new_balance NUMBER (9,2); BEGIN old_balance account credit_limit END; Oracle Center of Excellence Scoping Variables and Constants. END ; account credit_limit

Slide 12:

SQL IN PL/SQL PL/SQL Oracle Center of Excellence

Slide 13:

SQL & PL/SQL Overview SQL Data Manipulation Language statement support 1. INSERT 2. UPDATE 3. DELETE 4. SELECT QuickNotes - SQL DML Support 1. The full ORACLE syntax is supported for these statements 2. A PL/SQL variable may be placed anywhere a constant may be legally placed. 3. An identifier is first checked to see if it is a column in the database . If not , it is assumed to be a PL/SQL identifier. 4.These statements may not appear as part of an expression. Oracle Center of Excellence

Slide 14:

SQL & PL/SQL Overview DECLARE my_sal NUMBER(7,2) := 3040.22; my_ename CHAR(25) := ‘WANDA’; my_hiredate DATE := ‘08-SEP-01’; BEGIN INSERT INTO emp (empno,ename,job,hiredate,sal ,deptno) VALUES (2345,my_ename,’cab Driver’,my_hiredate,my_sal,20); END; INSERT 7400 ALLEN 1600 INSERT Oracle Center of Excellence

Slide 15:

SQL & PL/SQL Overview DECLARE max_allowed CONSTANT N UMBER := 5000; good_cust CHAR(8) := ‘VIP’; BEGIN UPDATE ACCOUNT SET CREDIT_LIMIT = MAX_ALLOWED WHERE TYPE = ‘EMPOLEE ‘OR TYPE =good_cust ; END; UPDATE UPDATE Oracle Center of Excellence

Slide 16:

SQL & PL/SQL Overview DECLARE bad_child_type CHAR(8) := ‘NAUGHTY’; BEGIN DELETE FROM santas_gift_list WHERE kid_rating =bad_child_type ; END; DELETE DELETE Oracle Center of Excellence

Slide 17:

SQL & PL/SQL Overview APPLICATION VAR1 VAR2 VAR3 QuickNotes - SELECT INTO 1 A SELECT statement is the only DML that returns data .You must provide location for this data to be stored via the INTO clause. 2. A SELECT..INTO statement must return exactly one row .Zero or multiple returned rows result in an error. 3. For multi-row SELECTs use cursors (discussed later). Oracle Center of Excellence

Slide 18:

SQL & PL/SQL Overview SELECT Syntax SELECT col1,col2……INTO var1,var2.. FROM table_name WHERE ... SELECT Ex. DECLARE part_name parts.name%TYPE; num_in_stock parts.num%TYPE; BEGIN SELECT name, num INTO part_name, num_in_stock FROM PARTS WHERE part_id = 234; ----manipulate the retrieved data here Oracle Center of Excellence

Slide 19:

Transaction processing SAVEPOINT Syntax SAVEPOINT < marker_name >; BEGIN INSERT INTO temp VALUES (1,1 ‘ROW 1’); SAVEPOINT A; INSERT INTO temp VALUES (2,2 ‘ROW 2’); SAVEPOINT B ; …. ROLLBACK TO SAVEPOINT B; COMMIT ; END; ROLLBACK TO Syntax ROLLBACK [WORK] TO SAVEPOINT < marker_name >; SAVEPOINT and ROLLBACK TO Ex. Oracle Center of Excellence

Slide 20:

SQL Functions SQL Functional support(within a SQL Statement): 1. Numeric (e.g. SQRT,ROUND,POWER) 2. Character (e.g. LENGTH,UPPER) 3. Date (e.g. ADD_MONTHS,MONTH_BETWEEN); 4. Group(e.g. AVG,MAX,COUNT) INSERT INTO phonebook (lastname) VALUES (UPPER(my_lastname)); OTHER SQL Functional support (outside of a SQL Statement): 1.MOST ORACLE SQL functional are available (except for group functions). X := SQRT(y); lastname := UPPER (lastname); age_diff := MONTHS_BETWEEN(birthday1,birthday2)/12; Oracle Center of Excellence

Slide 21:

Conditional and Iterative Control PL/SQL Oracle Center of Excellence

Slide 22:

Logical Comparisons Logical Comparisons form the basis of conditional control in PL/SQL; the result of these comparisons are always either TRUE ,FALSE or NULL. 1. Anything compared with NULL results in a NULL value. 2. A NULL in an expression evaluates to NULL (except concatenation) Ex. 5 + NULL -evaluate to NULL ‘PL/’ || NULL || ‘SQL’ evaluate to PL/SQL PL /SQL Datatypes NUMBER CHAR DATE BOOLEAN Operators < , > =, != <=, >= Oracle Center of Excellence

Slide 23:

Logical Comparisons Boolean Operators: AND ,OR,NOT FALSE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE NULL NULL NULL NULL NOT NULL OR AND Oracle Center of Excellence

Slide 24:

Oracle Center of Excellence “If” Statements “If ” statements are used to conditionally execute the statement or sequence of statements. “IF “ Statements syntax IF <condition> THEN <sequence of statement > [ELSEIF <condition> THEN <sequence of statement > ] ---ELSEIFs may be repeated [ELSE <sequence of statements>] END IF; QuickNotes --” IF ”Statements 1. <condition> must evaluate to a Boolean datatype (I.e. TRUE ,FALSE,or NULL) 2. If <condition is TRUE ,then the associated <sequence of statement is executed ;otherwise, it is not. 3. At most one <sequence of statement > gets executed.

Slide 25:

Oracle Center of Excellence “If” Statements DECLARE num_jobs NUMBER(7); BEGIN SELECT COUNT(*) INTO num_jobs FROM auditions WHERE actorid=&&actor_id AND called_back =‘YES’; IF num_jobs> 90 THEN UPDATE actor SET actor_rating = ‘ OSCAR time’ WHERE actorid = &&actor_id; ELSE IF num_jobs> 75 THEN UPDATE actor SET actor_rating = ‘ DAY time soaps’ WHERE actorid = &&actor_id; ELSE UPDATE actor SET actor_rating = ‘ Waiter’ WHERE actorid = &&actor_id; END IF; COMMIT; END; Ex .

Slide 26:

Oracle Center of Excellence “If” Statements BLOCK 1 . IF a >= b THEN do this …..; ELSE do_this….; END IF; BLOCK 2 . IF b > a THEN do that …..; ELSE do_this….; END IF; Given any pair of non-NULL values for “a” and”b”, will Block 1 and Block 2 do the same thing? What if either “a” or”b” (or both) is NULL ? The NULL Trap

Slide 27:

Oracle Center of Excellence Loop Statement Overview Loops repeat a statement or sequence of statements multiple times. Four types of loop: 1. Simple Loops. 2. Numeric For Loops. 3. While Loops. 4. Cursor FOR Loops.

Slide 28:

Oracle Center of Excellence Loop Statements Simple Loops repeat sequence of statements multiple times. Simple Loop syntax Loop <sequence of statement> END LOOP ;---sometimes called an ‘infinite’ loop Exit statements exit any type of loop immediately. Exit Syntax EXIT [WHEN <condition >]; -- ‘infinite’ loop insurance

Slide 29:

Oracle Center of Excellence Loop Statements ……Example DECLARE ctr NUMBER(3) := 0; BEGIN LOOP INSERT INTO LOG VALUES (ctr,’ITERATION COMPLETE’); ctr := ctr +1; IF ctr = 1500 THEN EXIT; END IF; END LOOP; END; DECLARE ctr NUMBER(3) := 0; BEGIN LOOP UPDATE TABLE 1 SET COMMIT = ‘UPDATES’ WHERE COUNT_COL = ctr;; ctr := ctr +1; IF ctr = 1500 THEN EXIT; END IF; END LOOP; END;

Slide 30:

Oracle Center of Excellence Loop Statements Numeric FOR Loops repeat sequence of statements fixed number of times. Numeric FOR Loop Syntax FOR <index> IN [REVERSE ] <integer>..<integer> LOOP <sequence of statements> The Loop Index takes on each value in range , one of a time , either in forward or reverse order . Example. BEGIN FOR i IN 1..500 LOOP INSERT INTO temp(message)VALUES (‘I will not sleep in class.’); END LOOP; END;

Slide 31:

Oracle Center of Excellence Loop Statement QuickNotes - Index : 1. It is implicitly of type NUMBER. 2. It is only defined within the loop . 3. Value may be referenced in an expression,but a new value may not be assigned to it within the loop Example DECLARE my_index CHAR(20) := ‘Fettuccini Alfredo’; BEGIN FOR my index IN REVERSE 21…30 LOOP /* redeclare s my_index*/ INSERT INTO temp(coll.)VALUES (my_index); /* insert the numbers 30 through 21*/ END LOOP; END; FOR i I N 1…256 LOOP x := x + i ;----legal i := I + 5;----illegal END LOOP;

Slide 32:

Oracle Center of Excellence Loop Statements WHILE Loops repeat a sequence of statements until a specific condition is no longer TRUE. While Loop Syntax WHILE <condition > LOOP <sequence of statements > END LOOP; QuickNotes - WHILE Loops 1. The term <condition> may be any legal PL/SQL condition (I.e. it must return a Boolean value of TRUE,FALSE,or NULL). 2. The sequence of statements will be repeated as long as <condition> evaluates to TRUE. Ex. DECLARE ctr NUMBER (3) := 0; BEGIN WHILE ctr < 500 LOOP INSERT INTO temp (message) VALUES (‘Well,I might sleep just a little’); ctr := ctr +1 ; END LOOP; END;

Slide 33:

Oracle Center of Excellence “ GO TO ” Statement Overview “ GO TO “ Statements jump to a different place in the PL/SQL block. “GO TO” Statements have parts 1. The GOTO statement itself. 2. A statement ‘label’ “GO TO “ Statement Syntax <<label_name >> X :=X+1 ; - - statement label GOTO LABEL_NAME - - JUMPS TO x := x +1

Slide 34:

Oracle Center of Excellence “ GO TO ” Statements NOT ALL GOTOs are Legal ! You can legally a GOTO a statement that is either: 1.in the same sequence of statements as the GOTO STATEMENT 2. In the sequence of statements that encloses the GOTO statement (I.e. an outer block) GOTO tour_brothers; IF a > b THEN b := b - a; <<your_brothers>> x := x - 1; END IF; <<dinner>> x := x + 1 ; y := y + 1; IF a >= b THEN b : = b + c; GOTO dinner; END IF;

Slide 35:

Other Uses for Statement Labels Labels may label any statement. In addition to their use as targets for GOTO statements, labels may be used for : 1. Blocks 2. Loops Labeling a block allows referencing of DECLARED objects that would otherwise not be visible because of Scoping rules. Syntax << label_name>> [ DECLARE -- declarations go here ] BEGIN -- executable statements go here [ EXCEPTION -- exception handlers go here ] END label_name ; -- must include the label_name

Slide 36:

Example << outer_block >> DECLARE n NUMBER; BEGIN n := 5; /* start a sub_block */ DECLARE x NUMBER := 10; n CHAR (10) := ‘Fifteen’; BEGIN INSERT INTO TEMP VALUES (outer_block.n ,x ,n ); COMMIT; END ; /* end of the sub_block */ END outer_block; Other Uses for Statement Labels

Slide 37:

Labeling a Block allows you to reference a variable that might be hidden by a column name. Example << sample >> DECLARE deptno NUMBER := 20; BEGIN UPDATE emp SET sal = sal * 1.1 WHERE deptno = sample.deptno; COMMIT; END sample; Other Uses for Statement Labels

Slide 38:

Labeling LOOPS allows you to reference objects that would otherwise not be visible because of scoping rules. EXAMPLE << compute_loop >> For i IN 1…10 LOOP < statements …. > DECLARE i NUMBER := 0 ; BEGIN INSERT INTO temp VALUES (i, compute_loop.I, ‘COMPLETE’ ); END; END LOOP compute_loop; - must include loop name here Other Uses for Statement Labels

Slide 39:

Labeling EXITs is a convenient way to specify exits from outer loops. EXAMPLE << outer_loop >> WHILE a > b LOOP b := b + 1; <<inner_loop >> WHILE b > c LOOP c := c + 2 ; EXIT outer_loop WHEN c > 200 ; END LOOP inner_loop; END LOOP outer_loop; Other Uses for Statement Labels

Slide 40:

C u r s o r s PL/SQL Oracle Center of Excellence

Slide 41:

Cursor Overview Every SQL DML statement processed by PL/SQL has an associated CURSOR. Two Types of CORSORS 1. EXPLICIT . Multiple row SELECT STATEMENTS 2. IMPLICIT All INSERT statements All UPDATE statements All DELETE statements Single row SELECT….INTO Statements

Slide 42:

Using explicit cursors STEP 1 . Declare the cursor DECLARE CURSOR <cursor name> IS <regular select statement> ; QuickNotes - CURSOR Declaration 1. The < regular select statement > must NOT include the INTO clause required in a single-row SELECT….INTO statement. 2. Declared cursors are scoped just like variables. Cursor Declaration Example DECLARE X NUMBER ( 7, 2 ) ; total NUMBER ( 5 ) lower_sal_limit CONSTANT NUMBER ( 4 ) := 1200 ; CURSOR c1 IS SELECT ename FROM emp WHERE sal > lower_sal_limit ; BEGIN ...

Slide 43:

Using Explicit Cursors STEP 2 . Open the cursor OPEN < cursor name > ; STEP 3 . Fetch data from the cursor FETCH < cursor name > INTO < var1 ,var2 >> > ; Quick Notes - FETCH 1. Retrieves one row of data from the cursor , and stores it in the specified variables ( similar to how a single-row select works ) . 2. There must be exactly one INTO variable for each column selected by the SELECT statement . 3. The first column gets assigned to var1 , the second to var2 , etc . STEP 4 . Close the cursor CLOSE < cursor name > ;

Slide 44:

Explicit Cursors Attributes %NOTFOUND %NOTFOUND Example LOOP FETCH my_cursor INTO my_ename , my_sal ; EXIT WHEN my_cursor%NOTFOUND ; -- process data here END LOOP ; %FOUND %FOUND Example FETCH my_cursor INTO my_ename ,my_sal ; WHILE my_cursor INTO my_ename , my_sal ; -- process data here FETCH my_cursor INTO my_ename ,my_sal ; END LOOP ;

Slide 45:

Explicit Cursor Attributes %ROWCOUNT %ROWCOUNT Example LOOP FETCH my_cursor INTO my_ename , my_sal ; EXIT WHEN ( my_cursor%NOTFOUND ) OR ( my_cursor%ROWCOUNT > 10 ) ; -- process data here END LOOP %ISOPEN %ISOPEN Example IF my_cursor%ISOPEN THEN FETCH my_cursor INTO my_ename , my_sal ; ELSE OPEN my_cursor ; END IF ;

Slide 46:

Using Explicit Cursors Example DECLARE sal_limit NUMBER ( 4 ) := 0 ; my_ename emp.ename%TYPE ; my_sal emp.sal%TYPE ; CURSOR my_cursor IS SELECT ename , sal FROM emp WHERE sal > sal_limit ; BEGIN sal_limit := 1200 ; OPEN my_cursor INTO my_ename , my_sal ; LOOP FETCH my_cursor INTO my_ename , my_sal ; EXIT WHEN my_cursor%NOTFOUND ; -nothing returned INSERT INTO new_table VALUES ( my_ename , my_sal ) ; END LOOP ; CLOSE my_cursor ; COMMIT ; END ;

Slide 47:

Oracle Center of Excellence Explicit Cursors -FOR Loops Cursor FOR Loops specify a sequence of statement to be repeated once for each row that is returned by the cursor. Cursor FOR Loop Syntax FOR <record _name> IN <cursor_name> LOOP ---statements to be repeated go here END LOOP; Numeric FOR Loop Similarities 1. Specify a set of rows from a table by using the cursor’s name vs. specifying a set of integers (i.e. 1…10) 2. Index takes on the values of each row vs. index taking on integer values (I.e. 1 through 10) Implicitly Declared <record_name> record_name cursor _name%ROWTYPE; To reference an element of the record, use the record_name.column_name notation.

Slide 48:

Oracle Center of Excellence Explicit Cursors -FOR Loops Conceptual Cursor Loop Model When a cursor loop is initiated, an implicit OPEN cursor_name is executed . For each row that satisfies the query associated with the cursor an, implicit FETCH is executed into the components of record_name. When there are no more rows left to FETCH, an implicit CLOSE cursor_name is executed and the loop is exited. Loops Loops Loops

Slide 49:

Explicit Cursors - FOR Loops Example DECLARE sal_limit NUMBER ( 4 ) := 0 ; total_sal NUMBER (9,2 ) := 0; CURSOR my_cursor IS SELECT ename , sal FROM emp WHERE sa l > sal_limit ; BEGIN sal_limit := 1200 ; -- implicitly OPEN done next FOR cursor_row IN my_cursor LOOP -- an implicit fetch done here INSERT INTO new_table VALUES (cursor_row.ename ,cursor.sal ) ; total_sal := total_sal + cursor_row.sal END LOOP ; --an implicit close done here. COMMIT ; END ;

Slide 50:

Oracle Center of Excellence Implicit Cursors - FOR Loops An Implicit Cursor is automatically associated with any SQL DML statement that does not have an explicit cursor associated with it. This includes : 1. ALL INSERT statements 2. ALL UPDATE statements 3. ALL DELETE statements 4. ALL SELECT…INTO statements QuickNotes - Implicit Cursors 1. Implicit cursor is called the “SQL” cursor --it stores information concerning the processing of the last SQL statement not associated with an explicit cursor. 2.OPEN, FETCH, AND CLOSE don’t apply. 3. All cursor attributes apply.

Slide 51:

Oracle Center of Excellence SQL %NOTFOUND SQL %NOTFOUND Example UPDATE emp SET sal = sal * 10.0 WHERE ename =“WARD” ; IF SQL %NOTFOUND THEN ---WARD wasn’t found INSERT INTO emp (empno, ename ,sal) VALUES ( 1234,’WARD’ 99999 ); END IF ; SQL %FOUND Implicit Cursors

Slide 52:

Oracle Center of Excellence SQL%ROWCOUNT SQL%ROWCOUNT Example DELETE FROM baseball_team WHERE batting _avg. < .100; IF SQL%ROWCOUNT > 5 THEN INSERT INTO temp(message) VALUES(“Your team needs helps .’); END IF; SQL %ISOPEN always evaluate to FALSE. Implicit Cursors

Slide 53:

Exception Handling PL/SQL Oracle Center of Excellence

Slide 54:

Exception Overview In PL/SQL error are called exceptions. When an exception is raised, processing jumps to the exception handlers. An exception handler is a sequence of statements to be processed when a certain exception occurs. When an exception handler is complete processing of the block terminates.

Slide 55:

Exception Overview Two Types of Exceptions 1. PREDEFINED INTERNAL EXCEPTIONS 2. USER-DEFINED EXCEPTIONS PL/SQL’s Exception Handlers vs. Conventional Error Handling

Slide 56:

Predefined Internal Exceptions Any ORACLE error “raises” an exception automatically ; some of the more common ones have names . Example TOO_MANY_ROWS ORA-(01427) - a single row SELECT returned more than one row NO_DATA_FOUND ORA-(01403) - a single row SELECT returned no data INVALID_CURSOR ORA-(01001) - invalid cursor was specified VALUES_ERROR ORA-(06502) - arithmetic ,numeric, string , conversion,or constraint error occurred. ZERO_DIVIDE ORA-(01476) - attempted to divide by zero DUP_VAL_ON_INDEX ORA-(00001) - attempted to insert a duplicate value into a column that has a unique index specified.

Slide 57:

Exception Handlers Syntax WHEN <exception_name [OR <exception_name…] then <sequence of statements> OR WHEN OTHERS THEN -- if used , must be last handler < sequence of statements> Example DECLARE employee_num emp.empno%TYPE; BEGIN SELECT empno INTO employee_num FROM emp WHERE ename = ‘BLAKE’; INSERT INTO temp VALUES(NULL, empno,Blake's employee_num’); DELETE FROM emp WHERE ename =‘BLAKE’; EXCEPTION WHEN TOO_MANY_ROWS OR NO_DATA_FOUND THEN ROLLBACL; INSERT INTO temp VALUES (NULL,NULL,’Blake not found, or more than one Blake’); COMMIT; WHEN OTHERS THEN ROLLBACK; END;

Slide 58:

User - Defined Exceptions User - defined Exceptions must be defined and explicitly raised by the user. EX. DECLARE x NUMBER; my_exception E XCEPTION; -- a new object type.. Raise your_exception; RAISE my_exception; Quick Notes -RAISE <exception_name> 1. Once an exception is RAISED manually, it is treated exactly the same as if it were a predefined internal exception. 2. Declared exceptions are scoped just like variables. 3. A user-defined exception is checked for manually and then RAISED , if appropriate.

Slide 59:

User - Defined Exceptions Example DECLARE my_ename emp.ename%TYPE :=‘BLAKE’; assigned_projects NUMBER; too_few_projects EXCEPTION BEGIN ---- get no of projects assigned to BLAKE IF assigned_project < 3 THEN RAISE too_few_projects; END IF; EXCEPTION --begin the exception handlers WHEN too_few_projects THEN INSERT INTO temp VALUES(my_ename,assigned_projects,’LESS THAN 3 PROJECTS!’) COMMIT; END;

Slide 60:

Exceptions Propagation Propagation Step #1 The current block is searched for a handler .If not found, go to step 2. Step#2 If an enclosing block is found, it is searched for it handler. Step#3 Step #1 and#2 are repeated until either there are no more enclosing blocks, or a handler is found . - If there are no more enclosing blocks, the exception is passed back to the calling environment (SQL *Plus,SQL *Forms, a precompiled program,etc.) - If the handler is found ,it is executed .when done the block in which the handler was found is terminated, and control is passed to thee enclosing block (if one exists), or to environment (if there is enclosing block) Quick notes 1. Only one handler per block may be active at a time. 2. If an exception is raised in a handler, the search for a handler for the new exception begins in the enclosing block of the current block.

Slide 61:

Exceptions Propagation Example 1 BEGIN . . . EXCEPTION WHEN B THEN . . . END; BEGIN IF X=1 THEN RAISE A: ELSEIF X=2 THEN RAISE B; ELSE RAISE C; EXCEPTION WHEN A THEN . . . END; Exception A is handled locally and execution resumes in the outer block

Slide 62:

Exceptions Propagation Example 2 BEGIN . . . EXCEPTION WHEN B THEN . . . END; BEGIN IF X=1 THEN RAISE A: ELSEIF X=2 THEN RAISE B; ELSE RAISE C; EXCEPTION WHEN A THEN . . . END; Exception B PROPAGATES to the first outer block with an appropriate handler Exception B handled and control is passed back to the calling environment

Slide 63:

Exceptions Propagation Example 3 BEGIN . . . EXCEPTION WHEN B THEN … .. END; BEGIN IF X=1 THEN RAISE A: ELSEIF X=2 THEN RAISE B; ELSE RAISE C; EXCEPTION WHEN A THEN ….. END; Exception C has no handler and will result in runtime unhandled exception

Slide 64:

Other uses of RAISE By itself ,the RAISE statement simply re-raise the current exception (as if it were being propagated). Syntax RAISE ; Quick Notes - RAISE 1 . RAISE may only be used in an exception handler

Slide 65:

EXCEPTION_INIT Exceptions may only be handled by name (not ORACLE error number). EXCEPTION_INIT allows naming of nay ORACLE error. SYNTAX PRAGMA EXCEPTION_INIT(<user defined exception_name > , <ORACLE_error_number>); Example DECLARE deadlock_detected exception; PRAGMA EXCEPTION_INIT (deadlock_detected, -60);

Slide 66:

Error Reporting Functions SQLCODE and SQLERRM 1 . Provided information on the exception currently being handled. 2. Especially useful in the OTHERS handler. SQLCODE 1. Returns the ORACLE error number of the exceptio0n or 1 if it was user-defined exception . SQLERRM 1 .Return the ORACLE error message currently associated with the current value of SQLCODE 2. May also use any ORACLE error number as an argument. QuickNotes - Error Reporting 1. If no exception is active … SQLCODE = 0 SQLERRM = “normal , successful completion” 2. SQLCODE and SQLERRM cannot be used within a SQL statement.

Slide 67:

Error Reporting Functions Ex. DECLARE sqlcode_val NUMBER; sqlcode_val CHAR(70); BEGIN … EXCEPTION WHEN OTHERS THEN sqlcode _val := SQLCODE - - - can’t insert - - - directly. sqlerrm_val := SQLERRM ; - - ditto INSERT INTO temp VALUES(sqlcode_val, NULL,sqlerrm_val); END;

Slide 68:

Stored Procedures Functions & Packages PL/SQL Oracle Center of Excellence

Slide 69:

Stored procedures and Functions Collections of SQL and PL/SQL statements. Stored in complied from in the database. Can call others and self. Can be called from all client environments Procedures and function (including remote) are the same, except a function returns a values and a procedure does not.

Slide 70:

Uses for procedures Define central well-known business functions. - Create an order - Delete a customer Store batch job in the database - Weekly account rollups Encapsulate a transaction - Gather and process information from remote nodes Funnel activity on a table through a single path - all changes to employee salaries should change department budgets.

Slide 71:

Creating a procedure Argument Modes

Slide 72:

Creating a procedure Example Tip : Write each procedure in a text file, and save(both P-code and source code is saved in the database) CREATE PROCEDURE fire_employee (empid NUMBER) AS BEGIN … DELETE FROM emp WHERE empno= fire_employee.empid; END

Slide 73:

Creating and changing a function Example CREATE FUNCTION get_bal (acc_no NUMBER(4)) RETURN NUMBER(11,2); IS acc_bal NUMBER(11,2); BEGIN SELECT balance INTO acc_bal FROM accounts WHERE account_id_no=acc_no; RETURN (acc_bal); END;

Slide 74:

Statements in procedures Valid statements in a procedure or function Restricted statements SQL DML or PL/SQL statements Calls to other procedures and functions stored in the database Calls to other procedures and functions in a remote database DDL Dynamic SQL In trigger, COMMIT,SAVEPOINT, and ROLLBACK

Slide 75:

Executing a stored procedure From within a PL/SQL block On a remote node From SQL*DBA and some ORACLE tools Within an anonymous block (when EXECUTE not available) From a precompiler application fire_employee (empno); scott.fire_employee (empno); scott.fire_employee@ny (empno); EXECUTE fire_employee (1043) SQLPLUS>BEGIN FIRE_EMPLOYEE(1043);END; EXEC SQL fire_employee (:empno);

Slide 76:

Executing a stored procedure From OCI CALL OSQL3 (cursor, /*parse*/ “BEGIN scott.fire_employee(:empno); END;”); CALL OBNDRV (..); /*bind vars*/ CALL OEXEC (..); /*EXECUTE*/

Slide 77:

Specifying procedure arguments Example Positional method Named method CREATE PROCEDURE update_sal (empno NUMBER, bonus NUMBER, sal_incr NUMBER) ….; List values in the order they are declared update_sal (7000,20,500); List argument names and values in any order, using special syntax update_sal (bonus=>20, sal_incr=>500, empno=>7000);

Slide 78:

Specifying procedure arguments Combination method Use both positional and named methods Once you specify a named parameter, must use named method for all remaining update_sal Legal (7000,sal_incr=>500,bonus=>20); update_sal Illegal (empno=>7000, sal_incr=>500,20);

Slide 79:

How procedures are entered into the database PL/SQL engine compiles the source code ORACLE stores a procedure in a database: SQL in procedure not stored in parsed form Object name Source code Parse tree Pseudo code(P-code) Syntax errors in dictionary table Dependency information Uses shared and cached SQL Allows SQL to be optimized dynamically (without recompiling referencing procedures)

Slide 80:

PL/SQL Compilation Errors Compile done by PL/SQL engine in RDBMS Error stored in the database To view errors: Use SQL*DBA command SHOW ERRORS Select from errors views USER_ERRORS ALL_ERRORS DBA_ERRORS

Slide 81:

PL/SQL Compilation Errors Executing SHOW ERRORS SQLDBA>create procedure test1 is begin test2;end; DBA-00072: Warning: PROCEDURE TEST1 created with compilation errors. SQLDBA>show errors ERRORS FOR PROCEDURE TEST1: LINE/COL ERROR --------------------------------------------------------------------------------------------- 1/0 PL/SQL: Compilation unit analysis terminated 1/33 PL/SQL-00219:’test2’ is not defined’ 2 rows selected

Slide 82:

PL/SQL Compilation Errors Fields in ERRORS views NAME :name of the object TYPE : one of the following: LINE :line number where error occurs TEXT :text of error PROCEDURE FUNCTION PACKAGE PACKAGE BODY

Slide 83:

USER-DEFINED System Errors Any procedure can raise an error and return a user defined error message and error number Error number range is -20000 to -20999 Range always reserved for user defined errors Oracle does not check if user defined error numbers are used uniquely Raise error within PL/SQL block with procedure Full pathname of procedure may be needed in early releases raise application_error (error_number,’text of the message’) sys.standard_utilities. Raise_application_error

Slide 84:

USER-DEFINED System Errors Example CREATE PROCEDURE fire_employee (empid NUMBER) AS BEGIN IF empid <=0 THEN raise_application_error (-20100,’Employee number must be> 0’); ELSE DELETE FROM emp WHERE EMPNO =EMPID; END IF; END; SQLDBA> EXECUTE FIRE_EMPLOYEE(-1); ORA=-20100: Employee number must be >0

Slide 85:

Debugging methods Version 6 Version 7 Future User INSERT’S information into a user defined table, and examines data PL/SQL will have methods of I/O to system defined table(TIO$LINES) Can use Version6 method TEXT_IO package Rolls back or commits with transaction DEBUG_IO package Writes despite error, rollback,commit A PL/SQL debugger

Slide 86:

Dependencies and Procedures A procedure is dependent on: Two types of dependencies ORACLE automatically checks dependencies every database object to which it refers (direct dependency) the database objects those objects depend on(indirect dependency) procedures,functions,packages,tables,views,synonyms,sequences local: objects are on the same node remote: objects are on separate nodes

Slide 87:

Recompilation of Dependent procedures When an object changes, its dependent objects are marked for recompilation Any change to definition of referenced object implies new version of reference object Dependent objects must be recompiled if referenced object changes Recompilation of dependent objects takes place automatically at runtime Reasons recompilation could fail Changing parameter list in called procedure Changing definition of or removing referenced column from referenced table Dropping referenced table

Slide 88:

Recompilation Procedure/function can be recompiled be either If recompilation fails, error information is put to error table RDBMS automatically, when next accessed(only if marked for recompilation) Manually by the user, using ALTER PROCEDURE command

Slide 89:

Manual Recompilation ALTER PROCEDURE schema Procedure COMPILE Example ALTER PROCEDURE add_department COMPILE

Slide 90:

Changing a procedure To modify a procedure, replace it: OR REPLACE option: CREATE without OR REPLACE on existing procedure fails CREATE OR REPLACE PROCEDURE fire_employee AS . . . END; Recreates the procedure even if it already exists Retains existing grants (need not reissue) Creates procedure even if there are syntax errors Marks dependent objects for recompilation Users executing old procedure finish that call: next invocation gets new procedure Facilitates development (one step)

Slide 91:

Dropping a procedure DROP PROCEDURE schema Procedure Example DROP PROCEDURE fire_employee; Marks dependent objects for recompilation

Slide 92:

Privileges for procedures Example Procedure executes under the authority of owner, not user executing procedure User of procedure need not have access to objects inside procedure Can only GRANT privileges on an entire package, not a procedure, function,or variable defined in the package GRANT EXECUTE ON scott.hire_fire TO mkennedy WITH GRANT OPTION ;

Slide 93:

Privileges for procedures PROCEDURE system privileges apply to procedures, functions, and packages

Slide 94:

Privileges for procedures

Slide 95:

Benefits of Procedures Security Integrity Performance Executes under security domain of procedure’s owner Provides controlled indirect access to database objects to non- privileged users Defines allowed operations on data Ensures related actions are performed together Reduces number of calls to thedatabase Decreases network traffic Pre-parses PL/SQL statements

Slide 96:

Benefits of Procedures Memory savings Productivity Takes advantages of shared SQL Requires only one copy of the code for multiple users Avoids redundant code for common procedures in multiple applications Reduces coding errors: no redundant code written

Slide 97:

Benefits of Procedures Maintainability High availability Enables system wide changes with one update Makes testing easier: duplicate testing not needed Dependency tracked by ORACLE Allows changing procedured on-line while users execute previous version

Slide 98:

Package A database object that groups related package constructs Package variables and cursors have persistent state Variables retain values and cursors retain contexts and positions for the duration of a user session State persists across a user’s calls in one session (not multiple sessions or users) Procedures functions cursor definitions variables and constants exception definitions

Slide 99:

Parts of a package Package specification Package body Declares (specifies) package constructs, including names and parameters publicly available procedures and functions May declare additional, private package constructs that are not publicly available Defines all package constructs (public and private) May be replaced without affecting package specification (Breaks dependency chain) Each session has own version of state

Slide 100:

Public and Private Package Constructs Public package constructs Private package constructs Declared in the package specification Available to anyone who can run the package Only declared in the package body Available to other package constructs within the package body Allows hiding procedures from programmers referencing the public constructs

Slide 101:

Public and Private Package Constructs PACKAGE hire_fire IS PROCEDURE hire_employee (. .); PROCEDURE fire_employee (. .); valid CHAR(1); END; Public declarations PACKAGE BODY hire_fire IS PROCEDURE hire_employee (. .); IS BEGIN. . . END; PROCEDURE fire_employee ( . .) IS BEGIN . . . END; FUNCTION check_num (. . ) RETURN. . IS BEGIN . . END; END; Definition of public constructs Definition of private function

Slide 102:

Public and Private Package Constructs Variable C Variable D Procedure B y :=d; z :=c; Procedure A x :=pk.c; Package specification Package body Package PK

Slide 103:

Uses of Packages Group related constructs Declare globally accessible variables Declare variables with persistent state Organize development activity Minimize name conflicts within a schema Simplify security limit recompilation Limit indirect dependencies Define modules, collections of procedures known to on team Personnel.audit  inventory.audit GRANT EXECUTE on entire package Change body of procedure or function without changing specification

Slide 104:

Creating a Package Specification Example /* Package specification declaring procedures and variables for hiring and firing employees */ CERATE PACKEAGE hire_fire AS /*Declare procedures */ PROCEDURE hire_employee (empno NUMBER, ename CHAR, mgr NUMBER, sal NUMBER, comm NUMBER, deptno NUMBER); PROCEDURE fire_employee (empid NUMBER); /*Global variable declaration*/ valid CHAR(1); END hire_fire;

Slide 105:

Creating a package body Example /*package body containing procedures to hire and ire employee */ CREATE PACKAGE BODY hire_fire AS /*Procedure to hire a employee*/ PROCEDURE hire_employee (empno NUMBER, ename CHAR, mgr NUMBER, sal NUMBER, comm NUMBER, deptno NUMBER); IS BEGIN /*VALID is declared in the package definition*/ valid :=check_sum(empno); /*IF valid empno then add user*/ IF valid =‘T’ THEN INSERT INTO EMP VALUES (empno,ename,mgr,sal,comm,deptno); END IF; END; (continued)

Slide 106:

Creating a package body Example(continued) /* Procedure to fire an employee number */ PROCEDURE fire_employee (empid NUMBER) IS BEGIN DELETE FROM emp WHERE empno =empid; END; /*function to check that the employee number>0.Local to the package */ FUNCTION check_sum (empno NUMBER) RETURN CHAR(1) IS answer CHAR(1); BEGIN answer :=‘T’; IF empno <0 THEN answer := ‘F’; END IF; RETURN (answer); END; END hire_fire; /*End of package*/

Slide 107:

Accessing package constructs PROCEDURE employee_admin /* The action to perform and the employee ID have been entered previously*/ IF action =“HIRE”THEN scott.hire_fire.hire_employee ( employee,ename,mgr,sal,comm,deptno); IF scott.hire_fire.valid =‘T’ THEN /*sports_club is another package that handles membership to the company sports club*/ sports_club.add (employee) END IF; ELSIF action =“FIRE” THEN scott.hire_fire.fire_employee (employee); sports_club.remove (employee); END IF;

Slide 108:

Dropping a Package schema Procedure

Slide 109:

Benefit Of Package Performance Persistence state Security Reduces disk I/o for subsequent calls - First call to package loads whole package into memory Retain values of package constructs for an entire session Access to the package allows access to public constructs in the package only. No need to issue GRANT for every procedure in package.

Slide 110:

Productivity Benefit Of Package Stores related procedures and function together Easier to manger changing the specification or definition of a construct. Reduces cascading dependencies Dependencies are at package ,not procedure level Can change package body with changing or affecting package specification

Slide 111:

Triggers PL/SQL Oracle Center of Excellence

Slide 112:

Triggers What a trigger is. Creating triggers Restrictions on triggers Dropping and recompiling Privileges for creating Applications Benefits

Slide 113:

What a Trigger is Application UPDATE t SET ….; INSERT INTO t…..; DELETE FROM t…; UPDATE(trigger) INSERT(trigger) DELETE(trigger) Table T Database

Slide 114:

What a Triggers is A user-defined PL/SQL block associated with a specific table, and implicitly fired (executed) when a triggering statement is issued against the table Made up of parts - Triggering event (INSERT/UPDATE/DELETE) - Trigger type (BEFORE/AFTER, per statement or per row) - Trigger restriction (optional) * WHEN clause - Trigger action * PL/SQL BLOCK Not the same as a SQL * Forms trigger

Slide 115:

Ex. of a Triggers ----- Keeping sal. In range for a job CREATE TRIGGER scott.salary_check BEFORE INSERT OR UPDATE OR UPDATE OF sal,job ON scott.emp FOR EACH ROW WHEN (NEW .job <> ‘PRESIDENT’) DECLARE minsal NUMBER; maxsal NUMBER; BEGIN /* get min and max salaries for the employee’s job from the SAL_GUIDE*/ SELECT minsal,maxsal INTO minsal,maxsal FROM sal_guide WHERE job = :NEW.job; /* If salary below min or above max,generate an error*/ IF (:NEW.sal < minsal.OR :NEW.sal > maxsal) THEN raise_application_error ( -20500,’salary’ || :NEW.sal|| ‘out of range for job’|| :NEW.job|| ‘for employee’|| :NEW.ENAME); ENDIF; END; /* End of Trigger*/

Slide 116:

Triggers and stored procedures similarities Made up of PL/SQL and SQL statements Use shared SQL areas Cannot be changed (must be dropped and recreated ) Dependencies tracked automatically by ORACLE

Slide 117:

Triggers and stored procedures Differences Triggers invoked implicitly ;procedures invoked explicitly Triggers and procedures crated with different SQL statements No CREATE OR REPLACE TRIGGER statement Triggers are associated with tables COMMIT ,ROLLBACK,SAVEPOINT not allowed in triggers (nor in procedures called by triggers)

Slide 118:

Triggers vs. SQL * Forms triggers Fires while statement executes Fires independently of and in addition to SQL *From triggers Fired by SQL statement from any tool or application Can prevent completion of SQL statement Fire as each statement is executed Associated with particular from Only executes when from is run Can fire after each field is entered pre/post INSERT/UPDATE /DELETE triggers execute when COMMIT key is pressed SQL *From trigger Database trigger

Slide 119:

Types of triggers Type of a trigger determines Each table have up to 12 triggers in all: The time when the trigger fires The item the trigger fires on BEFORE trigger: before the triggering action AFTER trigger: after the triggering action Row trigger:once for each row affected by the triggering statement Statement trigger:once for the triggering statement,regardless of the number rows affected INSERT/UPDATE/DELETE)* BEFORE/AFTER)* STATE/ROW)

Slide 120:

Types of triggers How to use each type BEFORE statement trigger BEFORE row trigger AFTER row trigger AFTER statement trigger To initialize global variables used in triggers To prevent update before it occurs To compute derived fields in the new row To prevent updates before they occur For auditing (by value,by row) Used by ORACLE snapshot mechanism) For auditing

Slide 121:

Triggers firing sequence INSERT,UPDATE or DELETE is applied to table statement to execute Execute BEFORE statement trigger For each row affected by the SQL statement: Execute AFTER statement trigger Complete deferred integrity constraint checking Returns to application Execute BEFORE row trigger Change row and perform integrity constraint checking Execute AFTER row trigger

Slide 122:

Expressions in triggers Referring to values in row triggers To refer to the old and new values of a column in row triggers, use the:OLD and :NEW prefixes: Notes: IF :NEW.sal< :OLD.sal. . . Values available in row triggers only New and old both available for UPDATE The old value in an INSERT is NULL T he new value in a DELETE is NULL BEFORE row trigger can assign values to :NEW if it is not set by UPDATE SET clause or INSERT VALUES list Can replace: NEW and :old with other correlation names if desired Colon dropped in when clauses

Slide 123:

Expressions in triggers conditional predicates If a trigger can fire on more than one type of DML operation use pre defined PL/SQL boolean variables to determine which caused the trigger to fire: To detect which column is being updated: IF INSERTING . . . IF UPDATING . . . IF DELETING . . . IF UPDATING (‘columnname’)

Slide 124:

Expressions in triggers CREATE TRIGGER total_salary AFTER DELETE OR INSERT OR UPDATE OF deptno,sal ON emp FOR EACH ROW BEGIN IF( DELETING ) OR ( UPDATING AND: OL D deptno <> : NEW deptno.) THEN UPDATE dept SET total_sal=total_sal -:OLD.sal WHERE deptno. = :OLD.deptno; END IF; IF (INSERT

Slide 125:

Restrictions on triggers Maximum number of 12 triggers for a table Prohibited statements in triggers: Cascading trigger limit Up to three(INSERT/UPDATE/DELETE)triggers of each type ROLLBACK COMMIT SAVEPOINT Note:Also applies to procedures called by triggers(including remote procedures The action of a trigger may cause another trigger to fire and so on (called “cascading triggers”) Limit the depth of cascading with an INIT.ORA parameter

Slide 126:

Restrictions on triggers Mutating tables A table that is being modified by an UPDATE,DELETE, or INSERT in a single user statement A trigger cannot SELECT from or change a mutating table(except current row, using :NEW and :OLD) Original EMP SELECT sal FROM emp WHERE mutating EMP UPDATE emp SET sal = sal *1.1; UPDATE(trigger)

Slide 127:

Restrictions on triggers Changes to updated/inserted values A trigger cannot change values explicitly referenced in the UPDATE statement SET clause or INSERT statement mutating EMP UPDATE emp SET deptno=10 WHERE empno =0405; UPDATE (trigger) GRATE TRIGGER bad BEGIN NEW.deptno:=30 END;

Slide 128:

Enabling and disabling triggers Possible states for a trigger Triggers are automatically enabled on creation Enabled Disabled Executes its triggered action if both: an appropriate statement is issued. trigger WHEN clause evaluates to TRUE(if present). Does not execute its triggered action

Slide 129:

Enabling and disabling triggers Reasons for disabling the trigger Have to load a large amount of data, and want to proceed quickly without firing triggers Want to INSERT, UPDATE or DELETE on a table whose trigger references a database object that is not available Example: SQL *loader using direct path automatically disables triggers

Slide 130:

Enabling and disabling triggers With ALTER TRIGGER schema trigger ENABLE DISABLE ALTER TRIGGER Examples ALTER TRIGGER reorder DISABLE; ALTER TRIGGER reorder ENABLE;

Slide 131:

Enabling and disabling triggers With ALTER TABLE schema table ALTER TABLE trigger ENABLE DISABLE trigger schema Examples ALTER TABLE INVENTORY DISABLE TRIGGER REORDER; ALTER TABLE INVENTORY ENABLE TRIGGER REORDER;

Slide 132:

schema trigger DROP TRIGGER Example Triggers cannot be altered; they must be dropped and recreated DROP TRIGGER reorder; Dropping Triggers

Slide 133:

Recompiling a trigger schema trigger ALTER TRIGGER COMPILE Manually recompile to resolve dependencies (same as procedures) Example ALTER TRIGGER reorder COMPILE;

Slide 134:

Applications of triggers Maintaining derived fields Implementing complex security rules Enforcing complex business rules Performing value-based auditing Making implied changes Maintaining table replication

Slide 135:

Examples of using triggers Deriving column values Derive column values for a row based upon a value provided by an INSERT or UPDATE statement. Must use BEFORE ROW trigger Cannot assign to new values set by triggering INSERT or UPDATE. Value must be derived first so the INSERT or UPDATE statement can use it. Trigger must fire for each row affected.

Slide 136:

Examples of using triggers Deriving column values CREATE TRIGGER upper_soundex BEFORE INSERT OR UPDATE OF ename, uppername, soundexname ON emp ; FOR EACH ROW BEGIN :NEW.uppername := UPPER (:NEW.ename); :NEW.soundexname := SOUNDEX(:NEW.ename); END;

Slide 137:

Examples of using triggers Complex security authorization Allows more complex security checking than provided by ORACLE Examples - Check for time of day,day of week - Check for terminal being used - Permit updates of certain amounts by specific users

Slide 138:

Examples of using triggers Complex security authorization CREATE TRIGGER emp_permit_changes BEFORE INSERT OR DELETE OR UPDATE ON emp DECLARE dummy INTEGER; BEGIN IF(TO_CHAR (sysdate,’DY’) IN(‘SAT,’SUN’)) THEN raise_application_error(-20504,’cannot change emp table during weekend’); END IF; SELECT COUNT(* ) INTO dummy FROM company_holidays WHERE day = TRUNC(sysdate); IF dummy>0 THEN raise_application_error(-20505,’cannot change emp table during holiday’); END IF; IF (TO_NUMBER(sysdate,’HH24’) NOT BETWEEN 8 AND 18) THEN raise_application_error (-20506,cannot change emp table in of_hours’); END IF; END;

Slide 139:

Examples of using triggers Enforcing complex business rules Complex check constraints that are not definable using declarative constraints Can be used to maintain data integrity across a distributed database (declarative integrity cannot span distributed database) Note: simple constraints are best handled by declarative constraints features.

Slide 140:

Examples of using triggers Enforcing complex business rules CREATE TRIGGER increase_chk BEFORE UPDATING OF sal ON emp FOR EACH ROW WHEN (NEW.sal <OLD.sal OR NEW.sal >1.1 * OLD. Sal) BEGIN raise_application_error(-20502, ‘may not decreased salary. Increase must be <10%’)’ END;

Slide 141:

Examples of using triggers Enforcing complex business rules CREATE TRIGGER scott.salary_check BEFORE INSERT OR UPDATE OR UPDATE OF sal, ON scott.emp FOR EACH ROW WHEN (NEW.job <>’PRESIDENT’) DECLARE minsal NUMBER; maxsal NUMBER; BEGIN SELECT minsal,maxsal INTO minsal,maxsal FROM sal_guide WHERE job= :NEW.job ; IF (:NEW.sal <minsal OR :NEW.sal > maxsal) THEN raise_application_error(-20503,’salary’ || :NEW.job || ‘for employee ‘|| :NEW.ename); END IF; END;

Slide 142:

Examples of using triggers Value based auditing Auditing that cannot be accomplished with standard RDBMS auditing features Allows Notes:many basic conditional auditing functions accomplished best by standard RDBMS auditing Triggers cannot audit: Exclusively DML auditing Per row auditing Storage of update details DDL SELECTs Logons

Slide 143:

Examples of using triggers Value based auditing CREATE TRIGGER audit_employee AFTER INSERT OR DELETE OR UPDATE ON emp FOR EACH ROW BEGIN IF auditpage. Reason IS NULL THEN raise_application_error(-20501,’MUST specify reason for update before performing update;use auditpackage.set_reason()”’); END IF; INSERT IF; INSERT INTO audit_employee VALUES ( :OLD.ssn, :OLD.name; :OLD.classification, :OLD.sal, :NEW.ssn; :NEW.name, :NEW.classification, :NEW.sal, auditpackage.reason,user,sysdate); END;

Slide 144:

Examples of using triggers Implied data changes Transparently perform an action when a triggering is executed Example: Inventory check generates a new order INVENTORY PENNDING_ORDERS

Slide 145:

Examples of using triggers Implied data changes CREATE TRIGGER inv_check AFTER UPDATE of on_hand ON inventory FOR EACH ROW WHEN (NEW.ON_HAND NEW.reord_pt) DECLARE x NUMBER; BEGIN SELECT COUNT(*) INTO x FROM pending_orders WHERE pending_orders.part_no= :NEW.part_no; IF x=0 THEN INSERT INTO pending_orders VALUES (:NEW.part_no, :NEW.reord_qty, SYSDATE); END IF; END;

Slide 146:

Examples of using triggers synchronous table replication Link identical tables(replicas) on different nodes so when replica is altered, changes are synchronously reflected in other replicas Replicas must contain a flag field that is set when they are updated to stop trigger cascading EMP_REP1 UPDATE... EMP_REP2 UPDATE...

Slide 147:

Benefits of triggers Security Integrity Allows sophisticated security checking Enables customized auditing mechanism to be built Ensures related operations on data are performed together Can be used to enforce complex business rules

Slide 148:

Benefits of triggers Performance Memory savings Productivity Reduces number of calls to the RDBMS Decreases network traffic Takes advantage of shared SQL Requires only one copy of the code for multiple users Requires only a single copy of the code be written and maintained(not multiple copies in client applications)