Oracle 遍历变量游标

背景

        由于我们的数据库系统中的游标特别多,DBA让我们优化,减少游标的使用。

  • 电脑系统:windows
  • 数据库:Oracle
  • 数据库图形化界面工具:Toad,DBeaver(我測試的時候用的)
  • 记录日期:2023-09-04

具体实现

        在我目前所了解到的数据库中能够实现遍历的有游标(CURSOR)、FOR循环两种方式,不过都要跟loop...end loop;联合使用。

        我这里都用了匿名函数,这些都是可以直接执行的,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;
FOR
  • 优点 
    • 类似代码中的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