Oracle Traversal変数カーソル

背景

        データベース システムには非常に多くのカーソルがあるため、DBA はカーソルの使用を最適化し、削減することを許可します。

  • コンピュータシステム: Windows
  • データベース: オラクル
  • データベース グラフィカル インターフェイス ツール: Toad、DBeaver (テスト中に使用)
  • 記録日: 2023-09-04

実装

        私がこれまでに知っているデータベースでは、トラバーサルを実装するにはカーソル (CURSOR) と FOR ループの2 つの方法がありますが、これらはループ...エンド ループ; と組み合わせて使用​​する必要があります。

        ここでは直接実行できる匿名関数を使用しています。DBeaver では [ Ctrl+Shift+O] を使用するか、[サーバー出力の表示]をクリックすることができます。

カーソル
  • アドバンテージ
    • グローバルまたはローカルでいつでもオンまたはオフにできます
  • 欠点がある
    • クエリされる変数の数、実行する必要がある変数の数
-- 這是一個匿名循環,可以直接執行

DECLARE
    var_text   VARCHAR(100);
    var_value1 VARCHAR(100);
    var_value2 VARCHAR(100);

    CURSOR GET_VALUE IS
        SELECT 'value1', 'value2' FROM dual
        UNION ALL
        SELECT 'value11', 'value22' FROM dual;

BEGIN
    OPEN GET_VALUE;

    DBMS_OUTPUT.PUT_LINE('CURSOR循環開始');

    LOOP
        BEGIN
            FETCH GET_VALUE INTO var_value1, var_value2;

            EXIT WHEN GET_VALUE%NOTFOUND;
            -- var_text:=var_text||''''||var_value1||'''';
            var_text := var_value1;
            DBMS_OUTPUT.PUT_LINE(var_value1);

            /*
             * 
             * 具體實現
             * 
             */
        END;
    END LOOP;

    CLOSE GET_VALUE;
END;
のために
  • アドバンテージ 
    • コード内のforeach(x in collection)ループと同様に、アクセスは foreach と同じであり、簡単にアクセスできます。
  • 欠点がある
    • 主に現地で使われている
    • from Dual などの場合は、フィールドを指定する必要があります。指定しないとエラーが報告されます。自分で作成したテーブルの場合、通常はエラーは報告されません。
-- 循环
DECLARE
    var_text   VARCHAR(100);
    var_value1 VARCHAR(100);
    var_value2 VARCHAR(100);
BEGIN
    DBMS_OUTPUT.PUT_LINE('FOR循环开始');
    
    FOR x IN (
        SELECT 'value1' value1, 'value2' value2, 'value3', 'value4', 'value5' FROM dual
        UNION ALL
        SELECT 'value111', 'value222', 'value333', 'value444', 'value555' FROM dual
        UNION ALL
        SELECT 'value911', 'value922', 'value933', 'value944', 'value955' FROM dual
    )
    LOOP
        var_value1 := x.value1;
        var_value2 := x.value2;
        
        DBMS_OUTPUT.PUT_LINE(var_value1);
        
        EXIT WHEN var_value2 = 'value222';
        -- IF var_value1 LIKE 'US%' THEN
        -- CONTINUE;
    END LOOP;
END;

要約する

        これらのメリット・デメリットは私が実際に使ってみて感じたことですが、実際には使い方によっても異なりますし、私が良い使い方を見つけていない可能性もありますので、ご参考までに。のみ。

おすすめ

転載: blog.csdn.net/qq_41128526/article/details/132663737