อย่างไรและเวลาที่จะใช้ sys_refcursor ใน oracle


10

บางคนสามารถให้คำอธิบายเล็ก ๆ เกี่ยวกับวิธีการและเวลาที่ใครบางคนควรใช้ sys_refcursor?

คำตอบ:


10

เคอร์เซอร์เป็นตัวชี้ไปยังชุดผลลัพธ์ของแบบสอบถาม โดยการส่งคืนsys_refcursorคุณอนุญาตให้ไคลเอนต์สามารถดึงข้อมูลได้มากหรือน้อยแถวจากแบบสอบถามตามที่ต้องการ ในแอปพลิเคชันแบบ stateful สิ่งนี้สามารถใช้เพื่อค้นหาผลลัพธ์

เคอร์เซอร์สามารถให้ความยืดหยุ่นมากกว่าการเขียนฟังก์ชัน PL / SQL ที่ส่งกลับอาร์เรย์เนื่องจากมันขึ้นอยู่กับไคลเอนต์จำนวนแถวที่จะดึงข้อมูลและเวลาที่จะหยุด ที่กล่าวว่าฉันไม่พบหลายกรณีที่ความยืดหยุ่นเพิ่มเติมนี้มีประโยชน์

เป็นที่น่าสังเกตว่าsys_refcursorมีการพิมพ์แบบอ่อนดังนั้นคุณสามารถส่งคืนพอยน์เตอร์ไปยังข้อความค้นหาที่ไม่เพียง แต่มีความแตกต่างจากหรือในส่วนคำสั่งเท่านั้น แต่มีจำนวนและประเภทคอลัมน์ที่แตกต่างกันด้วย หรือคุณสามารถใช้เคอร์เซอร์ที่พิมพ์อย่างรุนแรงซึ่งคอลัมน์ในชุดผลลัพธ์ได้รับการแก้ไข

สิ่งนี้ช่วยให้คุณสามารถเขียนฟังก์ชั่นที่ส่งกลับแบบสอบถามที่แตกต่างเช่น

create function get_data ( type varchar2 ) return sys_refcursor as
  ret_cur sys_refcursor;
begin

  if type = 'EMP' then
    open ret_cur for select * from emp;
  elsif type = 'DEPT' then
    open ret_cur for select * from dept;
  end if;

  return ret_cur;
end;

อย่างไรก็ตามหากคุณใช้sys_refcursorในการสร้างฟังก์ชั่น "เปิดแบบสอบถาม" ทั่วไปดังที่กล่าวมาข้างต้นคุณอาจทำสิ่งผิดปกติ!


@Chris ... ทำไมฟังก์ชั่นตัวอย่างของคุณถึงเป็น "ผิด"
Johnny Wu

2
@JohnnyWu ฟังก์ชั่น "รับฉันทุกอย่าง" จะยากในการจัดการ คุณจะทดสอบอย่างไรเพื่อให้แน่ใจว่าคุณได้ผลลัพธ์ที่ถูกต้องในทุกกรณี? เรื่องความปลอดภัยล่ะ สิ่งนี้อาจจำเป็นถ้าคุณกำลังสร้างเฟรมเวิร์ก แต่สำหรับตรรกะทางธุรกิจทั่วไปมันจะดีกว่าถ้ามีแยกget_empsและget_deptsฟังก์ชั่น
Chris Saxon

1

ตัวอย่างของความเป็นไปได้: เนื่องจากมันมี pl / sql อยู่ด้านหลังเราสามารถกำหนดวัตถุเพื่อแทนแถวได้กำหนดตาราง pl / sql ของวัตถุเหล่านั้น

create type T_MY_TABLE as table of t_my_object;

และจบลงด้วย

OPEN p_recordset FOR select * from table( v_my_table );

ดังนั้นแทนที่จะสร้าง mongo บ่อยครั้งที่หนาแน่นและ / หรือการสอบถามโดยตรงที่คลุมเครือในตารางฐานข้อมูลหนึ่งสามารถสร้างตารางภายในและมีพลังทั้งหมดของ PL / sql เพื่อเติม และลูกค้าเก็บรวบรวมชุดผลลัพธ์จะไม่มีใครฉลาด และการเปลี่ยนคำจำกัดความของตารางภายในนั้นง่ายกว่าจากการจัดการที่ดีกว่าการเปลี่ยนตารางฐานข้อมูล

นอกจากนี้เมื่อใช้ตัวสร้างรายงานอย่างแจสเปอร์คุณสามารถผลัก SQL ออกจากรายงานและลงในฐานข้อมูลและเรียกใช้โพรซีเดอร์เพื่อรับชุดระเบียนโดยปล่อยให้ด้านรายงานเพื่อเน้นการจัดรูปแบบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.