游标和循环中的选择之间的区别

时间:2015-08-28 19:31:37

标签: plsql

我现在一直有这个问题

我们可以为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;

为什么我们需要一个光标呢?请你告诉我这些差异及其优缺点吗?

2 个答案:

答案 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放在使用结果集的代码之前。这可以使代码更容易理解。

一个有用的语法区别是,在第一种形式中,您可以将参数传递给游标以修改其行为(请参阅上面的链接以获取语法)。因此,如果您多次使用相同的基本游标定义,但传入的参数不同,则使用前者。