[英]How to define a cursor later?
在Oracle文檔中,它提到了游標包含兩個部分,即聲明和定義。
您可以先聲明它(使用cursor_declaration), 然后再在同一塊 ,子程序或程序包中定義它(使用cursor_definition),或者同時聲明並定義(使用cursor_definition)。
我看過但未能找到一個代碼示例,該示例顯示了如何在以后定義光標。
我想聲明三個游標,但僅在進行時定義它們。 例如,游標1將刪除游標2需要做的工作。 我有來自不同系統的數據,可以用以下三種方法之一進行匹配。 一旦匹配,就不需要再次匹配,因此其他匹配的游標不需要在開始就定義好了的那些值。
這是我期望的樣子,但可能是錯誤的
DECLARE
CURSOR X IS ...; --cursor declaration and definition
CURSOR Y; --cursor declaration
CURSOR Z; --cursor declaration
BEGIN
FOR i IN X LOOP
--DO STUFF
END LOOP;
Y IS ...; --cursor definition
FOR ii IN Y LOOP
--DO STUFF
END LOOP;
Z IS ...; --cursor definition
FOR iii IN Z LOOP
--DO STUFF
END LOOP;
END;
有一些相關的問題
我必須承認,我從未考慮過或嘗試過“推遲”單個塊中光標的定義。 但是,它們肯定會正確地通知您可以在程序包規范中定義游標聲明,並將其“隱藏”在正文中。
這是一個例子:
CREATE PACKAGE species_pkg
IS
CURSOR species_cur
RETURN endangered_species%ROWTYPE;
END;
/
CREATE PACKAGE BODY species_pkg
IS
CURSOR species_cur
RETURN endangered_species%ROWTYPE
IS
SELECT *
FROM endangered_species
ORDER BY common_name;
END;
/
您可以使用LiveSQL腳本進行嘗試。
但是我真的不認為這就是您想要實現解決方案的目的。 相反,我將使用游標變量,如Mick Mnemonic在他的答案中向您展示的。
將游標聲明從其定義中分離出來的主要好處是,您可以遵循神聖的“信息隱藏”原理。 從理論上講,開發人員不需要了解查詢的實現,只需知道返回的數據集的描述即可。
聽起來您想要REF CURSOR
:
DECLARE
CURSOR X IS SELECT stuff FROM mytable; --cursor declaration and definition
TYPE cursor_type IS REF CURSOR;
cursor_y cursor_type; --cursor declaration
cursor_z cursor_type; --cursor declaration
query_string VARCHAR2(200) := 'SELECT stuff FROM anothertable WHERE id=:b1';
BEGIN
FOR i IN X LOOP
--DO STUFF
END LOOP;
OPEN cursor_y FOR query_string USING my_bind_variable1;
--cursor definition using dynamic SQL and a bind variable
FOR ii IN Y LOOP
--DO STUFF
END LOOP;
OPEN cursor_z FOR SELECT stuff FROM anothertable2; --cursor definition
FOR iii IN Z LOOP
--DO STUFF
END LOOP;
END;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.