ตอนที่ 8 : การสร้าง Declare Temp Table - TEMPORARY (Oracle : Stored Procedure) |
ตอนที่ 8 : การสร้าง Declare Temp Table - TEMPORARY (Oracle : Stored Procedure) ในการเขียน Stored Procedure บน Oracle Database เราสามารถให้ Stored Procedure เรียกใช้งาน Temp Table ได้เช่นเดียวกัน ซึ่งจะเป็นเสมือนการสร้าง Table ชั่วคราว จุดเด่นของ Temp Table ในการเขียน Store Procedure คือ โดยพื้นฐานแล้วการเขียน Query เพื่ออ่านข้อมูลจาก Table ก็คือการดึงค่า Result กลับมาใช้บน Application และในกรณีถ้า SQL Query ที่มีความซับซ้อนจนกว่าจะเขียน Query ในแบบปกติได้ เราก็จะใช้การ Select ค่า Result แต่ล่ะส่วน แล้วค่อนนำค่าที่ได้ไป Insert ลงใน Temp Table และเมื่อได้ค่า Result ทั้งหมดที่ต้องการแล้วก็จะใช้การ Select ข้อมูลแล้วคาอยส่งกลับไปยังตัว Call ซึ่งวินี้นี้ก็เป็นวิธีที่ถูกนิยมนำมาใช้งานกันอย่างมาก และการเขียนก็ค่อนข้างง่าย เพียงแค่สร้าง Temp Table พร้อมกับ Column และ Data Type จากนั้นสามารถทำการ Insert ข้อมูลลงใน Table หรือจะเลือก Insert จาก Table อื่น ๆ จนครบตามความต้องการ แล้วค่อยส่งค่าทั้งหมดกลัลบไป ส่วนข้อมูลต่าง ๆ ใน Temp Table ทั้งหมด เมื่อมีการ Commit แล้ว ข้อมูลที่ถูก Insert ลงไปจะหาย Delete ไปอัตโมนัติ
Table : CUSTOMER
Declare TABLE Syntax
CREATE GLOBAL TEMPORARY TABLE temp_table (
NO NUMBER(1),
NAME VARCHAR2(50),
COUNTRY_NAME VARCHAR2(50)
)
ON COMMIT DELETE ROWS;
ในการสร้าง Temp Table หรือ Temporary Table จะไม่สามารถสร้างได้ใน Stored Procedure จะต้องสร้างเหมือนกับการสร้าง Table ทั่ว ๆ ไป แล้วใน Stored Procedure ค่อยเรียกใช้งาน ส่วนคำสั่ง ON COMMIT DELETE ROWS; คือจะมีการ Delete ข้อมูลอัโตนมัติเมื่อ Commit หรือ ทำงานเสร็จสิ้น
Example 1 : การสร้างเรียกใช้และ Insert ข้อมูลงใน Temp Table พร้อมกับส่งค่ากลับไป
CREATE OR REPLACE PROCEDURE GET_CUSTOMER
AS
BEGIN
-- Insert Table
INSERT INTO temp_table (NO,NAME,COUNTRY_NAME) VALUES ('1','Weerachai Nukitram','Thailand');
INSERT INTO temp_table (NO,NAME,COUNTRY_NAME) VALUES ('2','Surachai Sirisart','United Stats');
INSERT INTO temp_table (NO,NAME,COUNTRY_NAME) VALUES ('3','Adisorn Boonsong','United Kingdom');
-- Loop Table
FOR CusInfo IN (SELECT * FROM temp_table)
LOOP
DBMS_OUTPUT.PUT_LINE(CusInfo.NO || ' ' || CusInfo.NAME || ' ' || CusInfo.COUNTRY_NAME);
END LOOP;
COMMIT;
END;
ตัวอย่างนี้จะเป็นการการ Insert ข้อมูลลงใน Table และการ Loop ข้อมูลของ temp_table และแสดง OUTPUT ออกทาง DBMS_OUTPUT
Call
EXEC GET_CUSTOMER()
Result
Example 2 : การ เรียกใช้ Temp Table และ Insert ข้อมูลงใน Table และการ Return ข้อมูลจาก Temp Table ไปยังตัว Call ผ่าน OUT และ SYS_REFCURSOR
CREATE OR REPLACE PROCEDURE GET_CUSTOMER(pCustomer OUT SYS_REFCURSOR)
AS
BEGIN
-- Insert Temp Table
INSERT INTO temp_table (NO,NAME,COUNTRY_NAME) VALUES ('1','Weerachai Nukitram','Thailand');
INSERT INTO temp_table (NO,NAME,COUNTRY_NAME) VALUES ('2','Surachai Sirisart','United Stats');
INSERT INTO temp_table (NO,NAME,COUNTRY_NAME) VALUES ('3','Adisorn Boonsong','United Kingdom');
-- Return SYS_REFCURSOR
OPEN pCustomer FOR SELECT * FROM temp_table;
-- Commit
COMMIT;
END;
ตัวอย่างนี้จะเป็นการ Insert ข้อมูลลงใน Temp Table และการ Select ข้อมูลจาก Temp Table แล้ว Return ค่าไปยังตัว Call ผ่าน Parameters ของ OUT ชนิด SYS_REFCURSOR
Call
VAR pCustomer REFCURSOR;
EXEC GET_CUSTOMER(:pCustomer)
PRINT pCustomer;
Result
|