Stored Procedures PL/SQL code stored in the database and executed when called by the user. Called by...

16
Stored Procedures PL/SQL code stored in the database and executed when called by the user. Called by procedure name from another PL/SQL block or using EXECUTE from SQL+. For example EXEC SQR(50) Example: Create procedure SQR (v_num_to_square IN number) AS v_answer number(10); BEGIN v_answer := v_num_to_square * v_num_to_square; dbms_output.put_line(v_answer); END; /

Transcript of Stored Procedures PL/SQL code stored in the database and executed when called by the user. Called by...

Page 1: Stored Procedures PL/SQL code stored in the database and executed when called by the user. Called by procedure name from another PL/SQL block or using.

Stored Procedures

• PL/SQL code stored in the database and executed when called by the user.• Called by procedure name from another PL/SQL block or using EXECUTE

from SQL+. For example EXEC SQR(50)• Example:

Create procedure SQR (v_num_to_square IN number)

AS

v_answer number(10);

BEGIN

v_answer := v_num_to_square * v_num_to_square;

dbms_output.put_line(v_answer);

END;

/

Page 2: Stored Procedures PL/SQL code stored in the database and executed when called by the user. Called by procedure name from another PL/SQL block or using.

Function• PL/SQL user defined function stored in the database and executed when a

function call is made in code: example x := SQUARED(50)

• Example:

Create or Replace Function SQUARED

(p_number_to_square IN number)

RETURN number

IS

v_answer number(10);

BEGIN

v_answer := p_number_to_square * p_number_to_square;

RETURN(v_answer);

END;

/

Page 3: Stored Procedures PL/SQL code stored in the database and executed when called by the user. Called by procedure name from another PL/SQL block or using.

Stored procedure

Page 4: Stored Procedures PL/SQL code stored in the database and executed when called by the user. Called by procedure name from another PL/SQL block or using.

Another Stored Procedure Example

Create or replace procedure mytabs

AS

CURSOR table_cursor IS

Select table_name from user_tables;

v_tablename varchar2(30);

BEGIN

open table_cursor;

fetch table_cursor into v_tablename;

while table_cursor%found loop

dbms_output.put_line(v_tablename);

fetch table_cursor into v_tablename;

end loop;

close table_cursor;

END;

Page 5: Stored Procedures PL/SQL code stored in the database and executed when called by the user. Called by procedure name from another PL/SQL block or using.

Triggers

• PL/SQL code executed automatically in response to a database event, typically DML.

• Like other stored procedures, triggers are stored in the database.

• Often used to:– enforce complex constraints, especially multi-table constraints. Financial posting

is an example of this.

– Trigger related actions

– implement auditing “logs”

– pop a sequence when creating token keys

• Triggers do not issue transaction control statements (such as commit). Triggers are part of the SQL transaction that invoked them.

• USER_TRIGGERS provides a data dictionary view of triggers.

Page 6: Stored Procedures PL/SQL code stored in the database and executed when called by the user. Called by procedure name from another PL/SQL block or using.

TriggersCREATE OR REPLACE TRIGGER <trigger_name>

[BEFORE/AFTER][DELETE/INSERT/UPDATE of <column_name |, column_name… |>

ON <table_name>

|FOR EACH ROW|

|WHEN <triggering condition>|

|DECLARE|

BEGIN

trigger statements

…………

END;

To delete a trigger use:

DROP TRIGGER <trigger_name>;

Page 7: Stored Procedures PL/SQL code stored in the database and executed when called by the user. Called by procedure name from another PL/SQL block or using.

Log Trigger ExampleCREATE OR REPLACE TRIGGER LOGSTUDENTCHANGES BEFORE INSERT OR DELETE OR UPDATE of Major ON STUDENTS FOR EACH ROWDECLARE v_ChangeType CHAR(1); v_sid varchar2(10);BEGIN IF INSERTING THEN V_ChangeType := 'I'; v_sid := :new.sid; ELSIF UPDATING THEN V_ChangeType := 'U'; v_sid := :new.sid; ELSE V_ChangeType := 'D'; v_sid := :old.sid;END IF;INSERT INTO MAJ_AUDIT (change_type, changed_by, timestamp, SID, old_major, new_major) VALUES (v_ChangeType, USER, SYSDATE, v_sid, :old.major, :new.major);END LOGSTUDENTCHANGES;

Page 8: Stored Procedures PL/SQL code stored in the database and executed when called by the user. Called by procedure name from another PL/SQL block or using.

Ben & Jerry Trigger Example(no employee can make more than 10 times as much as the lowest paid employee)

CREATE OR REPLACE TRIGGER SalaryTrig

BEFORE INSERT ON Employees

FOR EACH ROW

DECLARE

v_upper_sal_limit NUMBER(10,2);

v_lower_sal_limit NUMBER(10,2);

BEGIN

SELECT MIN(salary)*10 INTO v_upper_sal_limit

FROM employees;

SELECT MAX(salary)/10 INTO v_lower_sal_limit

FROM employees;

IF :new.salary NOT BETWEEN v_lower_sal_limit AND v_upper_sal_limit THEN

RAISE_APPLICATION_ERROR(-20001,'salary out of allowed range');

END IF;

END SalaryTrig;

/

Notes: Application error number is a parameter between –20,000 and –20,999.

You could also stop the insert by "poisoning" it, changing a :new

buffer value to one that you know will not pass constraint evaluation.

Page 9: Stored Procedures PL/SQL code stored in the database and executed when called by the user. Called by procedure name from another PL/SQL block or using.

Bordoloi and Bock

TYPES OF TRIGGERS

Example: statement trigger

CREATE OR REPLACE TRIGGER mytrig1 BEFORE DELETE OR INSERT OR UPDATE ON employee

BEGIN

IF (TO_CHAR(SYSDATE, 'day') IN ('sat', 'sun')) OR (TO_CHAR(SYSDATE,'hh:mi') NOT BETWEEN '08:30' AND '18:30') THEN RAISE_APPLICATION_ERROR(-20500, 'table is secured');

END IF;

END;

/

The above example shows a trigger that limits the DML actions to the employee table to weekdays from 8.30am to 6.30pm. If a user tries to insert/update/delete a row in the EMPLOYEE table, a warning message will be prompted.

Page 10: Stored Procedures PL/SQL code stored in the database and executed when called by the user. Called by procedure name from another PL/SQL block or using.

Bordoloi and Bock

TRIGGERS

The trigger_name references the name of the trigger.

BEFORE or AFTER specify when the trigger is fired (before or after the triggering event).

The triggering_event references a DML statement issued against the table (e.g., INSERT, DELETE, UPDATE).

The table_name is the name of the table associated with the trigger.

The clause, FOR EACH ROW, specifies a trigger is a row trigger and fires once for each modified row.

A WHEN clause specifies the condition for a trigger to be fired.

Bear in mind that if you drop a table, all the associated triggers for

the table are dropped as well.

Page 11: Stored Procedures PL/SQL code stored in the database and executed when called by the user. Called by procedure name from another PL/SQL block or using.

Bordoloi and Bock

TYPES OF TRIGGERS

Triggers may be called BEFORE or AFTER the following events:

INSERT, UPDATE and DELETE.

The before/after options can be used to specify when the trigger body should be fired with respect to the triggering statement. If the user indicates a BEFORE option, then Oracle fires the trigger before executing the triggering statement. On the other hand, if an AFTER is used, Oracle fires the trigger after executing the triggering statement.

Page 12: Stored Procedures PL/SQL code stored in the database and executed when called by the user. Called by procedure name from another PL/SQL block or using.

Bordoloi and Bock

TYPES OF TRIGGERS

• A trigger may be a ROW or STATEMENT type. If the statement FOR EACH ROW is present in the CREATE TRIGGER clause of a trigger, the trigger is a row trigger. A row trigger is fired for each row affected by an triggering statement.

• A statement trigger, however, is fired only once for the triggering statement, regardless of the number of rows affected by the triggering statement

Page 13: Stored Procedures PL/SQL code stored in the database and executed when called by the user. Called by procedure name from another PL/SQL block or using.

Bordoloi and Bock

TYPES OF TRIGGERS

Example: statement trigger

CREATE OR REPLACE TRIGGER mytrig1 BEFORE DELETE OR INSERT OR UPDATE ON employee

BEGIN

IF (TO_CHAR(SYSDATE, 'day') IN ('sat', 'sun')) OR (TO_CHAR(SYSDATE,'hh:mi') NOT BETWEEN '08:30' AND '18:30') THEN RAISE_APPLICATION_ERROR(-20500, 'table is secured');

END IF;

END;

/

The above example shows a trigger that limits the DML actions to the employee table to weekdays from 8.30am to 6.30pm. If a user tries to insert/update/delete a row in the EMPLOYEE table, a warning message will be prompted.

Page 14: Stored Procedures PL/SQL code stored in the database and executed when called by the user. Called by procedure name from another PL/SQL block or using.

Bordoloi and Bock

Example: ROW Trigger

CREATE OR REPLACE TRIGGER mytrig2

AFTER DELETE OR INSERT OR UPDATE ON employee

FOR EACH ROW

BEGIN

IF DELETING THEN

INSERT INTO xemployee (emp_ssn, emp_last_name,emp_first_name, deldate)

VALUES (:old.emp_ssn, :old.emp_last_name,:old.emp_first_name, sysdate);

ELSIF INSERTING THEN

INSERT INTO nemployee (emp_ssn, emp_last_name,emp_first_name, adddate)

VALUES (:new.emp_ssn, :new.emp_last_name,:new.emp_first_name, sysdate);

ELSIF UPDATING('emp_salary') THEN

INSERT INTO cemployee (emp_ssn, oldsalary, newsalary, up_date)

VALUES (:old.emp_ssn,:old.emp_salary, :new.emp_salary, sysdate); ELSE

INSERT INTO uemployee (emp_ssn, emp_address, up_date)

VALUES (:old.emp_ssn, :new.emp_address, sysdate);

END IF;

END;

/

Page 15: Stored Procedures PL/SQL code stored in the database and executed when called by the user. Called by procedure name from another PL/SQL block or using.

Bordoloi and Bock

TYPES OF TRIGGERS

Example: ROW Trigger

• The previous trigger is used to keep track of all the transactions performed on the employee table. If any employee is deleted, a new row containing the details of this employee is stored in a table called xemployee. Similarly, if a new employee is inserted, a new row is created in another table called nemployee, and so on.

• Note that we can specify the old and new values of an updated row by prefixing the column names with the :OLD and :NEW qualifiers.

Page 16: Stored Procedures PL/SQL code stored in the database and executed when called by the user. Called by procedure name from another PL/SQL block or using.