Oracle中的显式游标和隐式游标有什么区别?

时间:2020-03-05 18:56:25  来源:igfitidea点击:

我对PL / SQL中的游标行话有点生疏。有人知道吗?

解决方案

回答

显式游标是我们声明的游标,例如:

CURSOR my_cursor IS
  SELECT table_name FROM USER_TABLES

隐式游标是为了支持我们编写的任何内联SQL(静态或者动态)而创建的。

回答

显式游标在声明块中定义为:

DECLARE 
CURSOR cur IS 
  SELECT columns FROM table WHERE condition;
BEGIN
...

直接在代码块中插入隐式游标:

...
BEGIN
   SELECT columns INTO variables FROM table where condition;
END;
...

回答

使用显式游标,我们可以完全控制如何访问数据库中的信息。我们决定何时打开游标,何时从游标(因此从游标的SELECT语句中的一个表或者多个表)获取记录,以及要何时关闭游标。通过检查游标属性,可以获得有关游标当前状态的信息。

有关详细信息,请参见http://www.unix.com.ua/orelly/oracle/prog2/ch06_03.htm。

回答

隐式游标是Oracle在执行查询时为我们"自动"创建的游标。它更易于编码,但会遭受

  • 效率低下(ANSI标准规定必须取两次以检查是否有多个记录)
  • 容易出现数据错误(如果我们遇到两行,则会引发TOO_MANY_ROWS异常)

例子

SELECT col INTO var FROM table WHERE something;

显式游标是我们自己创建的游标。它需要更多的代码,但是却提供了更多的控制权,例如,如果我们只想要第一个记录,而不关心是否还有其他记录,则可以只打开-获取-关闭。

例子

DECLARE   
  CURSOR cur IS SELECT col FROM table WHERE something; 
BEGIN
  OPEN cur;
  FETCH cur INTO var;
  CLOSE cur;
END;

回答

Oracle数据库执行的每个SQL语句都有一个与之关联的游标,这是一个用于存储处理信息的私有工作区。 Oracle服务器为所有DML和SELECT语句隐式创建隐式游标。

我们可以声明并使用Explicit游标命名私有工作区,并在程序块中访问其存储的信息。

回答

显式...

光标foo是select * from blah;
开始
关闭游标yada yada yada时打开获取出口

不要使用它们,使用隐式

光标foo是select * from blah;

对于foo循环中的n
x = n.some_column
结束循环

我想你甚至可以做到

对于n in(从blah中选择*)循环...

坚持隐式,他们关闭自己,他们更具可读性,他们使生活变得轻松。

回答

如今,隐式游标比显式游标更有效。

http://www.oracle.com/technology/oramag/oracle/04-sep/o54plsql.html

http://asktom.oracle.com/pls/asktom/f?p=100:11:0:::::P11_QUESTION_ID:1205168148688

回答

Google是朋友:http://docstore.mik.ua/orelly/oracle/prog2/ch06_03.htm

PL/SQL issues an implicit cursor
  whenever you execute a SQL statement
  directly in your code, as long as that
  code does not employ an explicit
  cursor. It is called an "implicit"
  cursor because you, the developer, do
  not explicitly declare a cursor for
  the SQL statement.
  
  An explicit cursor is a SELECT
  statement that is explicitly defined
  in the declaration section of your
  code and, in the process, assigned a
  name. There is no such thing as an
  explicit cursor for UPDATE, DELETE,
  and INSERT statements.

回答

在回答第一个问题。直接来自Oracle文档

A cursor is a pointer to a private SQL
  area that stores information about
  processing a specific SELECT or DML
  statement.

回答

游标是Oracle表上的SELECTED窗口,这意味着Oracle表中存在一组满足某些条件的记录。游标也可以选择表的所有内容。使用游标,我们可以操纵Oracle列,并在结果中使用别名。隐式游标的示例如下:

BEGIN
   DECLARE
      CURSOR C1
      IS
         SELECT DROPPED_CALLS FROM ALARM_UMTS;

      C1_REC   C1%ROWTYPE;
   BEGIN
      FOR C1_REC IN C1
      LOOP
         DBMS_OUTPUT.PUT_LINE ('DROPPED CALLS: ' || C1_REC.DROPPED_CALLS);
      END LOOP;
   END;
END;
/

使用FOR ... LOOP ... END LOOP可以对游标的记录进行全部分析后,自动打开和关闭游标。

显式游标的示例如下:

BEGIN
   DECLARE
      CURSOR C1
      IS
         SELECT DROPPED_CALLS FROM ALARM_UMTS;

      C1_REC   C1%ROWTYPE;
   BEGIN
      OPEN c1;

      LOOP
         FETCH c1 INTO c1_rec;

         EXIT WHEN c1%NOTFOUND;

         DBMS_OUTPUT.PUT_LINE ('DROPPED CALLS: ' || C1_REC.DROPPED_CALLS);
      END LOOP;

      CLOSE c1;
   END;
END;
/

在显式游标中,我们以显式方式打开和关闭游标,检查记录的存在并说明退出条件。

回答

隐式游标仅返回一条记录并被自动调用。但是,显式游标是手动调用的,并且可以返回多个记录。