Oracle中的显式游标和隐式游标有什么区别?
我对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; /
在显式游标中,我们以显式方式打开和关闭游标,检查记录的存在并说明退出条件。
回答
隐式游标仅返回一条记录并被自动调用。但是,显式游标是手动调用的,并且可以返回多个记录。