PL/SQL คืออะไร ตอนที่ 4 (Cursor)

PL/SQL Cursor

    ก่อนรู้จักกับ Cursor ต้องเข้าใจก่อนว่าเมื่อรันคำสั่ง SQL กับฐานข้อมูล Oracle ปกติจะมีการใช้พื้นที่ในหน่วยความจำภายในฐานข้อมูลที่เรียกว่า work area เพื่อใช้ในการทำงานกับคำสั่งเหล่านั้น
    Work area ประกอบไปด้วยข้อมูลต่างๆ เช่น คำสั่ง SQL ผลลัพธ์ที่เกิดจากผลของการทำงานคำสั่ง เป็นต้น ซึ่งจะมีตัวแปรชนิด Pointer ที่คอยชี้ไปยังหน่วยความจำนั้นซึ่งเราเรียกมันว่า Cursor
    Cursor เป็นโครงสร้างข้อมูลของ PL/SQL ที่มีการตั้งชื่ออ้างอิงถึง work area ดังนั้นเมื่อเรียกใช้ Cursor ก็หมายถึงสามารถดึงข้อมูลที่ถูกเก็บอยู่ใน work area มาใช้งานได้

cursor tree
Cursor แบ่งเป็น 2 ชนิด

Implicit Cursors คือ Cursor ที่ถูกเขียนโดยระบบอยู่แล้ว พวก DML เช่น คำสั่ง insert update delete และ select ที่เขียนมาใน block ที่ return ค่าเพียง record เดียว
Explicit Cursors คือ Cursor ที่เราต้อง Declare เองเพื่อใช้งาน ซึ่งเราต้องเขียนคำสั่งต่างๆ เพื่อจัดการ ได้แก่ การนำคำสั่ง open close fetch ฯลฯ เหล่านี้เขียนเข้าไปใน Block

Static Cursors กำหนดค่าให้ตายตัวเปลี่ยนแปลงไม่ได้
Ref Cursors เปลี่ยนแปลงให้ cursor ไปชี้ที่อื่นได้อิสระ แล้วยังใช้ return ออกมาให้ได้อีกด้วย

Explicit Cursor นั้นมีการใช้งานเป็นไปตาม Flow ดังนี้

Declare > Open > Fetch > Close

Declare

Syntax:
  CURSOR identifier [(parameter detail)] IS query-expression;

Sample:
  DECLARE
    CURSOR c1 IS select * from m_user;
    user_rec c1%ROWTYPE;
  BEGIN
    OPEN c1;
  LOOP
    FECTH c1 INTO user_rec

Open เป็นการเรียก cursor ชื่อ c1 ให้ทำงาน โดยแสดงผลลัพธ์ (Active set) ออกมา

Syntax:
  OPEN cursor-identifier [(argument list)]

Sample:
  OPEN c1;

Fetch เป็นการดึง Current Row ที่ Pointer ชี้อยู่ขึ้นมาทำงาน โดยการเก็บแถวนั้นเข้าไปไว้ในตัวแปรของ PL/SQL ที่ถูกกำหนดไว้ในส่วนของ DECLARE

Syntax:
  FETCH cursor-identifier INTO variable, variable, ….

Sample:
  FETCH c1 INTO firstname, lastname;

Close เป็นการปิด Cursor โดยปล่อยแถวของ Active set เมื่อเลิกใช้งาน ในที่นี้เมื่อเราสั่ง Close แล้ว เราสามารถ OPEN CURSOR ขึ้นมาใช้งานได้อีกแปลว่าเราเปิด active set นั้นมาใช้อีกครั้ง

Syntax:
  CLOSE cursor-identifier;

Sample:
  CLOSE c1;

Attributes ที่ใช้ควบคุมการทำงานของ cursor มีอยู่ 4 ประเภท
%FOUND ถ้าใน active set มีตั้งแต่ 1 แถวขึ้นไป %FOUND จะเป็นค่า true ถ้าไม่มีแถวเลยจะเป็น false
%NOTFOUND ทำงานตรงข้ามกับ %FOUND
%ROWCOUNT แสดงเลขแถวที่ถูก fetch อยู่ขณะนั้นจาก active set
%ISOPEN ถ้า cursor ยัง open อยู่ %ISOPEN จะเป็นค่า True ถ้าไม่จะเป็น false

เนื้อหาที่เกี่ยวข้อง:
PL/SQL คืออะไร ตอนที่ 1
PL/SQL คืออะไร ตอนที่ 2
PL/SQL คืออะไร ตอนที่ 3
PL/SQL คืออะไร ตอนที่ 4

PL/SQL คืออะไร ตอนที่ 3

หลังจากที่ได้รู้จักตัวแปรต่างๆ กันไปแล้วต่อไปเรามาดูว่าเราจะควบคุมโปรแกรมได้อย่างไร เพื่อให้คำสั่งที่เรากำหนดนั้นเดินตามเส้นทางที่เราต้องการได้ โดยการกำหนดเงื่อนไข และควบคุมทิศทางโปรแกรมและการทำงานตามลำดับของ Operator ใน PL/SQL

สำหรับ PL/SQL จะมี Statement ที่ใช้ควบคุมการทำงานดังนี้

  • IF – เป็นการกำหนดทางเลือกให้โปรแกรมโดยมีเงื่อนไขมารองรับ
  • GOTO – สั่งให้โปรแกรมกระโดดไปยังจุดที่ต้องการ
  • Basic Loops – ทำคำสั่งวนซ้ำ
  • FOR Loops – ทำคำสั่งวนซ้ำแบบกำหนดจำนวนรอบได้เอง
  • WHILE Loops – ทำคำสั่งวนซ้ำแบบมีเงื่อนไขหากพบว่าไม่ตรงเงื่อนไขจะออกจากการทำงานใน loop
  • EXIT – คำสั่งออก loop

อ่านเพิ่มเติม PL/SQL คืออะไร ตอนที่ 3

PL/SQL คืออะไร ตอนที่ 2

หลังจากที่รู้ไปแล้วว่า PL/SQL เป็นอย่างไรใน PL/SQL คืออะไร ตอนที่ 1

ในตอนที่ 2 นี้ผมจะพูดเกี่ยวกับเครื่องหมายต่างๆ และตัวแปร (Variables) ว่ามีเงื่อนไขการใช้งานอย่างไร นำไปใช้ได้ยังไงบ้าง อ่านเพิ่มเติม PL/SQL คืออะไร ตอนที่ 2

PL/SQL คืออะไร ตอนที่ 1

PL/SQL คืออะไร ชื่อเต็มคือ Procedure Language SQL เป็นการนำคำสั่งต่างๆ ภาษา SQL มารวมกันเป็นโปรแกรมทำให้คำสั่งเหล่านั้นมีประสิทธิภาพ และทำงานได้ตรงตามความต้องการของผู้ใช้มากขึ้น และกว้างขวางมากขึ้น

จุดสังเกตุอย่างหนึ่งที่ต้องระวังคือ Procedure Language SQL เป็นภาษาที่ไม่สนใจอักษรตัวเล็ก-ใหญ่ (Non-Casesensitive)

อ่านเพิ่มเติม PL/SQL คืออะไร ตอนที่ 1