我现在一直有这个问题
我们可以为Example实现游标
SET serveroutput ON;
DECLARE
CURSOR test_cursor
IS
SELECT * FROM employees;
BEGIN
FOR i IN test_cursor
LOOP
DBMS_OUTPUT.PUT_LINE(i.employee_id||' '||i.First_name);
END LOOP;
END;
我们也可以通过以下方式实现相同的方法
SET serveroutput ON;
BEGIN
FOR rec IN
(SELECT * FROM employees
)
LOOP
DBMS_OUTPUT.PUT_LINE(rec.employee_id ||' ' ||rec.First_name);
END LOOP;
END;
为什么我们需要一个光标呢?请你告诉我这些差异及其优缺点吗?
答案 0 :(得分:0)
在这两种情况下,您实际使用游标。 第一个是声明和命名(显式)。 第二个是匿名的(隐含的)。
http://docs.oracle.com/cd/B10501_01/appdev.920/a96624/01_oview.htm#740
我通常使用显式游标来获得更好的代码可读性,在我想重用游标的情况下,我可以从结果缓存中获取数据或将数据提取到变量中并遍历数组。
另外,据我所知,执行计划不会像使用隐式游标那样频繁生成(DB通过查询的哈希搜索SGA中的查询,并且可以找到已经存储的执行计划,因此跳过执行计划生成。)
https://docs.oracle.com/database/121/TGSQL/tgsql_sqlproc.htm#TGSQL175
答案 1 :(得分:0)
首先,这些都被称为游标FOR LOOPs。
http://docs.oracle.com/database/121/LNPLS/cursor_for_loop_statement.htm#LNPLS1143
两种形式之间的一个可用性差异是第二种形式将正在执行的SQL放在使用结果集的代码之前。这可以使代码更容易理解。
一个有用的语法区别是,在第一种形式中,您可以将参数传递给游标以修改其行为(请参阅上面的链接以获取语法)。因此,如果您多次使用相同的基本游标定义,但传入的参数不同,则使用前者。