Procedure and Functions Procedures Syntax: [CREATE [OR REPLACE]] PROCEDURE [(p1, p2…)] [IS | AS] [declarations] BEGIN [Execution Statements] [EXCEPTIONS exception_handling] END [Pname]; / Pname 2 Example CREATE PROCEDURE PrintName IS Address VARCHAR2(50); BEGIN Address := ‘102 Main St, Frostburg MD 21532’; DBMS_OUTPUT.PUT_LINE(Address); END PrintName; / 3 Run the Procedure EXEC EXEC PrintName(); PrintName; 4 Procedure with Parameter CREATE OR REPLACE PROCEDURE Print_B_Date (V_ID NUMBER) IS V_B_Date DATE; BEGIN SELECT B_Date INTO V_B_Date FROM Employee WHERE ID=V_ID; DBMS_OUTPUT.PUT_LINE(V_B_Date); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(‘No Data Found’); END Print_B_Date; / 5 Call Procedure & Check for Errors EXEC Print_B_Date(112); SHOW ERRORS; 6 Example CREATE PROCEDURE Largest (P1 NUMBER, P2 NUMBER) IS BEGIN DBMS_OUTPUT.PUT_LINE(‘The First Number is’ || P1); DBMS_OUTPUT.PUT_LINE(‘The Second Number is’ || P2); IF(P1>P2) THEN DBMS_OUTPUT.PUT_LINE(‘The Largest Number is’ || P1); ELSE DBMS_OUTPUT.PUT_LINE(‘The Largest Number is’ || P2); END IF; END Largest; / 7 Call Procedure EXEC Largest(12, 24); EXEC Largest(24, 12); 8 Procedure with default value CREATE PROCEDURE Data ( Name VARCHAR2, B_Date DATE DEFAULT SYSDATE) IS BEGIN DBMS_OUTPUT.PUT_LINE(Name || B_Date); END; / 9 Procedure Call EXEC Data(‘Jim Smith’, ‘12-MAR-03’) EXEC Data(‘Mary Show’); 10 Dropping Procedure DROP PROCEDURE Largest; 11 Functions Syntax: [CREATE [OR REPLACE]] FUNCTION [(p1, p2…)] RETURN datatype [IS | AS] [declarations] BEGIN [Execution Statements] [EXCEPTIONS exception_handling] END [Fname]; / Fname 12 Example CREATE FUNCTION PrintNameF RETURN BOOLEAN IS Address VARCHAR2(50); BEGIN Address := ‘102 Main St, Frostburg MD 21532’; DBMS_OUTPUT.PUT_LINE(Address); RETURN true; END PrintNameF; / 13 Run a Function: DECLARE flag BOOLEAN; BEGIN Flag:=PrintNameF; IF flag THEN DBMS_OUTPUT.PUT_LINE(‘Function Printed Correctly’)); END IF; END; / 14 Function with Parameter CREATE OR REPLACE FUNCTION Print_B_DateF (V_ID NUMBER) RETURN CHAR IS V_B_Date DATE; found CHAR(1):=‘F’; F_ID NUMBER:=V_ID; BEGIN SELECT B_Date INTO V_B_Date FROM Employee WHERE ID=F_ID; DBMS_OUTPUT.PUT_LINE(V_B_Date); found:=‘T’; RETURN found; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(‘No Data Found’); END Print_B_DateF; / 15 Calling a Function: SELECT FROM Print_B_DateF(102) DUAL; 16 Dropping Function DROP FUNCTION Print_B_DateF; 17 Find the largest Value DECLARE –--p1, p2, p3, p4 large NUMBER; BEGIN large:=p1; IF large< p2 THEN large:=p2; END IF; IF large< p3 THEN large:=p3; END IF; IF large< p4 THEN large:=p4; END IF; END; / 18 PACKAGES DBMS_OUTPUT.NEW_LINE; DBMS_OUTPUT.PUT_LINE ('Display This’); 19 PACKAGE HEADER (Specification) CREATE [ OR REPLACE] PACKAGE p_name IS |AS -- functions -- procedures -- variables -- constants -- exceptions -- cursors END [p_name ]; 20 EXAMPLE CREATE PACKAGE myPackage AS PROCEDURE PrintLarge (P1 NUMBER, p2 NUMBER); FUNCTION FindLarge (P1 NUMBER, P2 NUMBER) RETURN NUMBER; END myPackage; 21 PACKAGE BODY CREATE OR REPLACE PACKAGE BODY p_name IS|AS --package body End p_name; 22 EXAMPLE CREATE OR REPLACE PACKAGE BODY MyPackage AS PROCEDURE PrintLarge (P1 NUMBER, p2 NUMBER) AS BEGIN IF p1> p2 THEN DBMS_OUTPUT.PUT_LINE(p1); ELSE DBMS_OUTPUT.PUT_LINE(p2); END IF; END PrintLarge; FUNCTION FindLarge (P1 NUMBER, P2 NUMBER) RETURN NUMBER AS large NUMBER; BEGIN IF p1> p2 THEN LARGE:=p1; ELSE LARGE:=p2; END IF; RETURN LARGE; END ; END myPackage; 23 Call Elements of Package: EXEC MyPackage.PrintLarge (32 , 11); SELECT FROM MyPackage.FindLarge( 22 , 43) DUAL; 24 EXAMPLE 2 CREATE OR REPLACE PACKAGE Employee_p AS FUNCTION E_Full_Name (Last_N testdata.employee.L_name%TYPE, First_N testdata.employee.F_name%TYPE) RETURN VARCHAR2; FUNCTION E_Name(E_id testdata.employee.id%TYPE) RETURN VARCHAR2; END Employee_p; 25 EXAMPLE 2 CREATE OR REPLACE PACKAGE BODY Employee_P AS FUNCTION E_Full_Name (Last_N Employee.L_name%TYPE, First_N Employee.F_name%TYPE) RETURN VARCHAR2 IS BEGIN RETURN Last_N || ‘, ‘ || First_N; END; 26 EXAMPLE 2 FUNCTION E_Name(f_id EMPLOYEE.id%TYPE) RETURN VARCHAR2 IS temp VARCHAR2(200); id EMPLOYEE.id%TYPE:=f_id; BEGIN SELECT (L_name || ‘ ‘ ||F_Name) INTO temp FROM employee WHERE employee.id = id; RETURN temp; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN NULL; WHEN TOO_MANY_ROWS THEN ….. END; 27 CALL FUNCTIONS of PACKAGE SELECT FROM Employee_p.E_NAME(107) DUAL; 28 Subprogram Location USER_OBJECTS USER_SOURCE USER_ERRORS SELECT FROM WHERE OBJECT_NAME, OBJECT_TYPE, STATUS USER_OBJECTS OBJECT_NAME = ‘PrintInfo’; OBJECT_NAME OBJECT_TYPE STATUS SIMPLE PROCEDURE VALID 29 Subprogram Location SELECT FROM WHERE TEXT USER_SOURCE NAME = ‘PrintInfo’ AND TYPE= ‘PROCEDURE’ ORDER BY line; TEXT ----------------------------------------CREATE OR REPLACE PROCEDURE PrintInfo AS ss NUMBER:=24; BEGIN DBMS_OUTPUT.PUT_LINE(ss); END PrintInfo; 30 Find Errors: SHOW ERRORS; -Line number of the error -Column number of the error -Text message of the error SELECT FROM WHERE line, position, text USER_ERRORS name=‘PrintInfo’ AND TYPE=‘PROCEDURE’; 31 Exception Handling CREATE FUNCTION Employee_P (f_id EMPLOYEE.id%TYPE) RETURN VARCHAR2 IS temp VARCHAR2(200); id EMPLOYEE.id%TYPE:=f_id; BEGIN SELECT (L_name || ‘ ‘ ||F_Name) INTO temp FROM employee WHERE employee.id = id; RETURN temp; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN NULL; WHEN TOO_MANY_ROWS THEN INSERT INTO errors VALUES (‘Error in statement ‘); RETURN NULL; END Employee_P; 32 Exception Handling DECLARE BEGIN EXCEPTION WHEN ZERO_DIVIDE THEN INSERT INTO table1(info) VALUES (info_data); COMMIT; WHEN OTHERS THEN ROLLBACK; END; 33 Exception Types: 1. Predefined Oracle Server errors: No declaration is needed ORA-01403 NO_DATA_FOUND ORA-01422 TOO_MANY_ROWS ORA-01476 ZERO_DIVIDE ORA-06500 STORAGE_ERROR ORA-06530 ACCESS_INTO_NULL ORA-06592 CASE_NOT_FOUND ORA-00001 DUP_VAL_ON_INDEX 34 Exception Types: 2. User_defined User determines an abnormal condition Declared in declaration section DECLARE e_TooManyNumbers EXCEPTION; 35 Raising USER_DEFINED Exceptions Example DECLARE e_TooManyNumbers EXCEPTION; V_NoStudent NUMBER(4); V_MaxStudent NUMBER(4); BEGIN SELECT Current_Students, Max_Students INTO V_NoStudent, V_MaxStudent FROM classes WHERE C_Num=455 AND Dept=‘ITEC’; IF V_NoStudent > V_MaxStudent THEN RAISE e_TooManyNumbers; END IF; 36 EXCEPTION WHEN e_TooManyNumbers THEN INSERT INTO log_file (info) VALUES (‘ITEC455 has:‘ || V_NoStudent || ‘Max No is:’ || V_MaxStudent); END; Chapter 18: Exception Handling 37