背景
由于我们的数据库系统中的游标特别多,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;
总结
那些优缺点都是我自己用的时候感觉的,这些东西其实有时候也看你如何使用,也有可能是我还没发现好的用法,仅供大家参考。