หน้าเว็บ

วันอังคารที่ 26 พฤศจิกายน พ.ศ. 2556

call store procedure inside SELECT statement : oracle

ต้องการวน loop ใน table เพื่อเรียกใช้งาน store procedure ที่เราเขียนไว้
begin
    for record in (select columnA, columnB, columnC from TEST_TABLE) loop
        -- 
        -- call store procedure in store package
        -- and pass variable (columnA, columnB and columnC) into store procedure
        --
        store_package.store_procedure(record.columnA, record.columnB, record.columnC);
    end loop;
end;
วันนี้ผมเจอกับเหตุการณ์นี้ครับ  คือพอดีผมเขียนคำสั่ง sql ขึ้นมา
แล้วปล่อยให้มันทำงานไปตามเงื่อนไขที่มีอยู่ใน table  ซึ่งมีอยู่เกือบๆ 1,000 เงื่อนไข
ผมก็คิดว่า  เดี๋ยวปล่อยให้มัน commit ในทีเดียวเลยแล้วกัน   ไม่น่าจะมีปัญหาอะไร
เพราะตอนที่ test นั้น ข้อมูลผมมีอยู่นิดเดียว  เลย run เสร็จภายในไม่กี่นาทีครับ

แต่พอเอา code ไป run จริงๆ มันก็ run ไม่ผ่านทุกที  เพราะข้อมูลจริงๆ ที่มีอยู่นั้น มีปริมาณมหาศาลมาก เมื่อต้องทำกับ 1,000 เงื่อนไขที่ผมใส่เข้าไป

ถ้าจะให้ run SQL จริงๆ run ทั้งวันก็ run ไม่เสร็จครับ  แต่กรณีนี้ตายตั้งแต่ 3 ชั่วโมงแรกแล้ว
นั่นเป็นเพราะ DBA (database administrator) เขาตั้งเวลา (timeout) เอาไว้ว่าถ้า run code แล้วยังไม่ commit ใน 3 ชม.  ให้ถือว่าคำสั่งนั้น fail ไปโดยปริยายครับ

โจทย์ที่ผมได้รับมาวันนี้คือ  ต้อง  run SQL ให้เสร็จ (commit) ภายใน 3 ชั่วโมง

ก็เลยต้องเอา code กลับมาแก้ใหม่  โดยย้าย code ที่ต้อง run ในแต่ละเงื่อนไขเข้าไปไว้ใน store procedure  เมื่อมันทำเงื่อนไขนึงเสร็จแล้ว  ก็ให้มัน commit ใน store procedure ทันทีครับ

แล้วเราจะส่งทุกเงื่อนไขเข้าไปใน store procedure ยังไง?

เลยเป็นที่มาของบทความนี้ครับ  โดยให้มันวน loop เพื่อส่งเงื่อนไขเข้าไปทีละเงื่อนไขนั่นเอง

ไม่มีความคิดเห็น:

แสดงความคิดเห็น