繁体   English   中英

以后如何定义游标?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM