ตอนที่ 10 : การใช้ Cursor บน Stored Procedure (Oracle : Stored Procedure) |
ตอนที่ 10 : การใช้ Cursor บน Stored Procedure (Oracle : Stored Procedure) สำหรับ Cursor บน Oracle Stored Procedure เป็นการประกาศ Declare ตัวแปร (Variable) ชนิด Cursor ซึ่งถ้าจะให้เข้าใจง่าย ๆ ก็คือ เป็นตัวแปรที่ได้จากค่าที่ได้จากการ Select Table ในขณะนั้น ๆ ที่ประกอบด้วยหลาย Column และ Index ในรูปแบบของ Recordset ที่สามารถกำหนด Block ของการใช้งาน และเราสามารถที่จะกำหนดให้ Cursor ระบุค่าตัวแปรไปยังรายการต่าง ๆ ภายใน Block ไปยังตำแหน่งในค่าตัวแปรได้ ซึ่งเจ้าตัวแปร Cursor นี้ใน Stored Procedure นิยมนำมาเก็บค่าที่ได้จากการ SELECT และนำค่าตัวแปร Cursor ที่ได้ไป Loop รายการของข้อมูลเพื่อทำงานอื่น ๆ
Table : CUSTOMER
Cursor Syntax
CURSOR cursor_name
IS
SELECT_statement;
Example 1 : ตัวอย่างการใช้ Cursor เพื่อ Loop ข้อมูลจาก SELECT และแสดงผลออกทาง OUTPUT
CREATE OR REPLACE PROCEDURE MY_STORED_PROCEDURE
AS
CURSOR curCustomer IS
SELECT CUSTOMER_ID, NAME, EMAIL FROM CUSTOMER;
BEGIN
DECLARE
sCustomerID VARCHAR2(4);
sName VARCHAR(150);
sEmail VARCHAR(150);
BEGIN
OPEN curCustomer;
LOOP
FETCH curCustomer INTO sCustomerID, sName, sEmail;
EXIT WHEN curCustomer%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(sCustomerID || ' ' || sName || ' ' || sEmail);
END LOOP;
CLOSE curCustomer;
END;
END;
อธิบายเพิ่มเติม
อ่านข้อมูลจาก SELECT ทั้งหมดมาจัดเก็บไว้ที่ curCustomer โดยเลือกเฉพาะ CUSTOMER_ID, NAME, EMAIL
CURSOR curCustomer IS
SELECT CUSTOMER_ID, NAME, EMAIL FROM CUSTOMER;
เปิดการใช้งาน Cursor
OPEN curCustomer;
Loop ข้อมูลจนกว่าจะถึง Record สุดท้าย โดย Assign ค่าไปยังตัวแปร sCustomerID, sName, sEmail; และแสดงผลทาง DBMS_OUTPUT.PUT_LINE
LOOP
FETCH curCustomer INTO sCustomerID, sName, sEmail;
EXIT WHEN curCustomer%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(sCustomerID || ' ' || sName || ' ' || sEmail);
END LOOP;
ปิด Cursor
CLOSE curCustomer;
Call
EXEC MY_STORED_PROCEDURE();
Example 2 : การใช้ Cursor และ Loop ข้อมูลด้วย FOR Cursor
CREATE OR REPLACE PROCEDURE MY_STORED_PROCEDURE
AS
CURSOR curCustomer IS
SELECT CUSTOMER_ID, NAME, EMAIL FROM CUSTOMER;
BEGIN
FOR CusInfo IN curCustomer
LOOP
DBMS_OUTPUT.PUT_LINE(CusInfo.CUSTOMER_ID || ' ' || CusInfo.NAME || ' ' || CusInfo.EMAIL );
END LOOP;
END;
เขียนได้อีกวิธีคือ
CREATE OR REPLACE PROCEDURE MY_STORED_PROCEDURE
AS
CURSOR curCustomer IS
SELECT CUSTOMER_ID, NAME, EMAIL FROM CUSTOMER
WHERE CUSTOMER_ID = 'C001';
BEGIN
DECLARE
sCustomerID VARCHAR2(4);
sName VARCHAR(150);
sEmail VARCHAR(150);
BEGIN
OPEN curCustomer;
FETCH curCustomer INTO sCustomerID, sName, sEmail;
DBMS_OUTPUT.PUT_LINE(sCustomerID || ' ' || sName || ' ' || sEmail);
CLOSE curCustomer;
END;
END;
Call
EXEC MY_STORED_PROCEDURE();
Example 3 : การใช้ Cursor จากการ Select ข้อมูล และการตรวจสอบว่ามีพบรายการข้อมูลหรือไม่
CREATE OR REPLACE PROCEDURE MY_STORED_PROCEDURE
AS
CURSOR curCustomer IS
SELECT CUSTOMER_ID, NAME, EMAIL FROM CUSTOMER
WHERE CUSTOMER_ID = 'C001';
BEGIN
DECLARE
BEGIN
OPEN curCustomer;
IF curCustomer%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('No Data.');
ELSE
DBMS_OUTPUT.PUT_LINE('Found Record');
END IF;
CLOSE curCustomer;
END;
END;
Call
EXEC MY_STORED_PROCEDURE();
|