由于我们的数据库系统中的游标特别多,DBA让我们优化,减少游标的使用。
在我目前所了解到的数据库中能够实现遍历的有游标(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;
- -- 循环
- 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;
那些优缺点都是我自己用的时候感觉的,这些东西其实有时候也看你如何使用,也有可能是我还没发现好的用法,仅供大家参考。