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

Mathurada Ekkapat
2 min readNov 1, 2017

--

PL/SQL CURSOR

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

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

credit: bossturteam

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

No responses yet

Write a response