Basic Loop Syntax : LOOP statement1; statement2; END LOOP; วิธีเช็คเงื่อนไขในการออกจาก Loop ทำได้ 2 แบบ 1) IF condition THEN EXIT; END IF; 2) EXIT WHEN condition (หรืออาจสั่ง EXIT; โดยไม่มีเงื่อนไขเลยก็ได้) ตัวอย่าง 1 : DECLARE v_ord_id NUMBER := 100; v_counter NUMBER(2) := 1; BEGIN LOOP INSERT INTO ord_lines (ord_id , item_id) VALUE (v_ord_id, v_counter); v_counter := v_counter + 1; EXIT WHEN v_counter > 10; END LOOP; END; ตัวอย่าง 2 : BEGIN LOOP /*ให้เริ่มทำการวน Loop*/ Select NVL(Code,’0’) Into :Block1.code From Master; /*ทำการดึงข้อมูลมาลง Form*/ If :System.Last_Record = ‘TRUE’ Then Exit; /*ตรวจสอบการออกจาก Loop*/ End if; Next_Record; END LOOP;
FOR loop Syntax : FOR index IN [REVERSE] lowerbound . . upperbound LOOP statement1; statement2; END LOOP; หมายเหตุ : - [REVERSE] ใช้สำหรับวน loop แบบย้อนหลัง (จาก upper_bound ลดลงทีละ 1 ไปเรื่อยๆ จนถึง lower_bound) - ไม่ต้องประกาศตัวแปร index ให้ตั้งชื่อได้เลย และโปรแกรมจะรู้จักตัวแปรที่เป็น index ภายใน loop เท่านั้น ตัวอย่าง : BEGIN FOR i In 1..99 Loop /*คำสั่ง For Loop 1 ถึง 99*/ Message(To_char(i)) ; /*แสดงค่า i */ END LOOP; END; WHILE loop Syntax : WHILE condition LOOP statement1; statement2; END LOOP; ตัวอย่าง : DECLARE v_ord_id NUMBER := 100; v_counter NUMBER(2) := 1; BEGIN WHILE v_counter <= 10 LOOP INSERT INTO ord_lines (ord_id , item_id) VALUE (v_ord_id , i); v_counter := v_counter + 1; END LOOP; END;
คำสั่ง Exception ใช้ในการตรวจสอบและป้องกันข้อผิดพลาดที่อาจเกิดขึ้นได้เนื่องจากการเขียนโปรแกรม Syntax : Statement… Exception When [Error Message] Then Statement ; Error Message ได้แก่ …
Exception …
Error
Raised if
CURSOR_ALREADY_OPEN
ORA-06511
you try to OPEN an already open cursor; you must CLOSE a cursor before you can reOPEN it
DUP_VAL_ON_INDEX
ORA-00001
you try to INSERT or UPDATE Duplicate values in a UNIQUE database column
INVALID_CURSOR
ORA-01001
you try an illegal cursor operation Such as closing an unopened cursor
INVALID_NUMBER
ORA-01722
the conversion of a character String to a number fails in a SQL statement
LOGIN_DENIED
ORA-01017
you log on to oracle with an Invalid username/password
NO_DATA_FOUND
ORA-01403
a SELECT INTO returns no rows, Or you refer to an unintialized Row in a PL/SQL table
NOT_LOGGED_ON
ORA-01012
your PL/SQL program issues a Database call without being Logged on to oracle
PROGRAM_ERROR
ORA-06501
PL/SQL has an internal problem Such as exiting a function that Has no RETURN statement
STORAGE_ERROR
ORA-06500
PL/SQL runs out of memory or Memory is corrupted
TIMEOUT_ON_RESOURCE
ORA-00051
a timeout occurs while oracle is Waiting for resource
TOO_MANY_ROWS
ORA-01422
a SELECT INTO returns more Than one row
TRANSACTION_BACKED_OUT
ORA-00061
the remote part of a transaction is Rolled back because oracle data Might be inconsistent at some Nodes
VALUE_ERROR
ORA-06502
the conversion of a character String to a number fails in a procedural statement, or an arithmetic, conversion, truncation, or constraint error occurs
ตัวอย่าง : Declare v_name Varchar2(100) ; Begin Select emp_name Into v_name From employee Where emp_id = ‘00001’ ; Exception When No_Data_Found Then Null ; /* เมื่อไม่พบข้อมูล */ End ; Subprograms มี 3 ประเภท คือ 1) PROCEDURE เป็นโปรแกรมย่อยที่ทำงานแล้วไม่มีการคืนค่ากลับ 2.) FUNCTION เป็นโปรแกรมย่อยที่นิยมใช้เพื่อหาค่าอะไรบางอย่างแล้วคืนค่านั้นกลับมาให้ในรูปของชื่อ function 3.) PACKAGE เป็นการรวบรวม PROCEDURE หรือ FUNCTION หลายๆ ตัวไว้ด้วยกัน เพื่อง่ายต่อการควบคุมในแง่ privilege และเป็นหมวดหมู่ดีขึ้น โครงสร้างการเขียน PROCEDURE และ FUNCTION • PROCEDURE name [ ( parameter, . . . ) ] IS PL/SQL block; • FUNCTION name [ ( parameter, . . . ) ] RETURN datatype IS PL/SQL block; หมายเหตุ PL/SQL block ให้เริ่มด้วยการประกาศตัวแปร (ถ้ามี) โดยไม่ต้องมี keyword DECLARE หรือ ถ้าไม่ใช้ตัวแปร ให้เริ่มด้วย BEGIN ได้เลย วิธีการประกาศ parameter ใน Subprograms param_name [ IN | OUT | IN OUT ] datatype [ { DEFAULT | := } expr ] โดย param_name คือชื่อ parameter [ IN | OUT | IN OUT] คือ mode ของ parameter IN หมายถึงเป็น parameter ที่รับค่าเข้ามาทำงาน โดยไม่มีการเปลี่ยนค่าระหว่างที่อยู่ใน subprogram OUT หมายถึงเป็น parameter ที่ไม่มีการรับค่าเริ่มต้นเข้ามา แต่จะใช้ในการส่งค่ากลับไป IN OUT หมายถึงเป็น parameter ที่รับค่าเข้ามาใช้ในการทำงานและสามารถเปลี่ยนแปลงค่าได้ใน subprogram ด้วย (คือลักษณะของ IN parameter และ OUT parameter รวมกันนั่นเอง) ตัวอย่าง Procedure PROCEDURE change_salary ( p_emp_id IN NUMBER, p_new_salary IN NUMBER) IS /* variables declaration (don’t include DECLARE keyword) */ BEGIN UPDATE emp SET salary = p_new_salary WHERE id = p_emp_id; COMMIT; END; ตัวอย่าง Function FUNCTION tax (p_value IN NUMBER) RETURN NUMBER IS BEGIN RETURN (p_value * .1); END;