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

Bri*_*n G 25 oracle plsql

我在PL/SQL中的光标术语上有点生疏.谁知道这个?

Ste*_*rli 41

隐式游标是Oracle在您执行查询时"自动"为您创建的游标.编码更简单,但受到影响

  • 效率低下(ANSI标准规定必须提取两次才能检查是否有多条记录)
  • 容易受到数据错误的影响(如果你得到两行,它会引发一个TOO_MANY_ROWS异常)

SELECT col INTO var FROM table WHERE something;
Run Code Online (Sandbox Code Playgroud)

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

DECLARE   
  CURSOR cur IS SELECT col FROM table WHERE something; 
BEGIN
  OPEN cur;
  FETCH cur INTO var;
  CLOSE cur;
END;
Run Code Online (Sandbox Code Playgroud)

  • -1因为效率低的原因是错误的,因为在我看来,一些7.x版本和数据错误的漏洞是一件好事.如果您期望一行,但是您得到两行,则非常希望您被TOO_MANY_ROWS异常警告. (8认同)
  • 这个答案是好的,我会投票给它,除非它说隐式游标是低效的,这是错误的 - 在它们合适的情况下,它们通常比显式游标更有效! (6认同)
  • 性能比较显示隐式速度最多快两倍:https://oracle-base.com/articles/misc/implicit-vs-explicit-cursors-in-oracle-plsql (2认同)

stj*_*roe 18

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

DECLARE 
CURSOR cur IS 
  SELECT columns FROM table WHERE condition;
BEGIN
...
Run Code Online (Sandbox Code Playgroud)

隐式游标直接在代码块中实现:

...
BEGIN
   SELECT columns INTO variables FROM table where condition;
END;
...
Run Code Online (Sandbox Code Playgroud)