[英]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.