簡體   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