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

===============>>#1 票数:40 已采纳

隐式游标是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;

===============>>#2 票数:17

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

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

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

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

===============>>#3 票数:4

1.CURSOR:当PLSQL发出sql语句时,它创建私有工作区来解析和执行sql语句,称为cursor。

2.IMPLICIT:当任何PL / SQL可执行块发出sql语句时。 PL / SQL创建隐式游标并自动管理意味着发生implcit open&close。 它在sql语句只返回一行时使用。它有4个属性SQL%ROWCOUNT,SQL%FOUND,SQL%NOTFOUND,SQL%ISOPEN。

3.EXPLICIT:由程序员创建和管理。 它需要每次显式打开,获取和关闭。 当sql语句返回多行时使用它。 它还有4个属性CUR_NAME%ROWCOUNT,CUR_NAME%FOUND,CUR_NAME%NOTFOUND,CUR_NAME%ISOPEN。 它使用循环处理多行。 程序员也可以将参数传递给显式游标。

  • 示例:显式游标

declare 
   cursor emp_cursor 
   is 
   select id,name,salary,dept_id 
   from employees; 
   v_id employees.id%type; 
   v_name employees.name%type; 
   v_salary employees.salary%type; 
   v_dept_id employees.dept_id%type; 
   begin 
   open emp_cursor; 
   loop 
   fetch emp_cursor into v_id,v_name,v_salary,v_dept_id; 
   exit when emp_cursor%notfound;
   dbms_output.put_line(v_id||', '||v_name||', '||v_salary||','||v_dept_id); 
   end loop;                    
   close emp_cursor; 
   end;

===============>>#4 票数:3

隐式游标需要匿名缓冲区内存。

显式游标可以通过使用它们的名称一次又一次地执行。它们存储在用户定义的存储空间中,而不是存储在匿名缓冲存储器中,因此可以在以后轻松访问。

===============>>#5 票数:3

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

游标是指向私有SQL区域的指针,该区域存储有关处理特定SELECT或DML语句的信息。

===============>>#6 票数:3

显式游标是您声明的游标,如:

CURSOR my_cursor IS
  SELECT table_name FROM USER_TABLES

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

===============>>#8 票数:2

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

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

===============>>#9 票数:1

谷歌是你的朋友: http//docstore.mik.ua/orelly/oracle/prog2/ch06_03.htm

只要代码不使用显式游标,PL / SQL就会在代码中直接执行SQL语句时发出隐式游标。 它被称为“隐式”游标,因为您(开发人员)不会为SQL语句显式声明游标。

显式游标是一个SELECT语句,它在代码的声明部分中显式定义,并在此过程中分配了一个名称。 对于UPDATE,DELETE和INSERT语句,没有明确的游标。

===============>>#10 票数:1

游标是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;
/

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

===============>>#11 票数:1

我知道这是一个古老的问题,但是,我认为从性能的角度来看,添加一个实际的例子来展示两者之间的差异会很好。

从性能的角度来看,隐式游标更快。

让我们看看两者之间的性能差异:

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2    l_loops  NUMBER := 100000;
  3    l_dummy  dual.dummy%TYPE;
  4    l_start  NUMBER;
  5
  6    CURSOR c_dual IS
  7      SELECT dummy
  8      FROM   dual;
  9  BEGIN
 10    l_start := DBMS_UTILITY.get_time;
 11
 12    FOR i IN 1 .. l_loops LOOP
 13      OPEN  c_dual;
 14      FETCH c_dual
 15      INTO  l_dummy;
 16      CLOSE c_dual;
 17    END LOOP;
 18
 19    DBMS_OUTPUT.put_line('Explicit: ' ||
 20                         (DBMS_UTILITY.get_time - l_start) || ' hsecs');
 21
 22    l_start := DBMS_UTILITY.get_time;
 23
 24    FOR i IN 1 .. l_loops LOOP
 25      SELECT dummy
 26      INTO   l_dummy
 27      FROM   dual;
 28    END LOOP;
 29
 30    DBMS_OUTPUT.put_line('Implicit: ' ||
 31                         (DBMS_UTILITY.get_time - l_start) || ' hsecs');
 32  END;
 33  /
Explicit: 332 hsecs
Implicit: 176 hsecs

PL/SQL procedure successfully completed.

因此,显而易见的显着差异。

这里有更多例子。

===============>>#12 票数:1

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

===============>>#13 票数:1

在PL / SQL中,游标是指向此上下文区域的指针。 它包含处理语句所需的所有信息。

隐式游标:只要执行了SQL语句,当语句没有显式游标时,Oracle就会自动创建隐式游标。 程序员无法控制隐式游标及其中的信息。

显式游标:显式游标是程序员定义的游标,用于获得对上下文区域的更多控制。 应在PL / SQL块的声明部分中定义显式游标。 它是在SELECT语句上创建的,它返回多行。

创建显式游标的语法是:

CURSOR cursor_name IS select_statement; 

===============>>#14 票数:0

如其他答案中所述,隐式游标更易于使用且不易出错。

Oracle PL / SQL中的隐式游标和显式游标显示隐式游标的速度比显式游标快两倍。

奇怪的是,还没有人提到Implicit FOR LOOP Cursor

begin
  for cur in (
    select t.id from parent_trx pt inner join trx t on pt.nested_id = t.id
    where t.started_at > sysdate - 31 and t.finished_at is null and t.extended_code is null
  )
  loop
    update trx set finished_at=sysdate, extended_code = -1 where id = cur.id;
    update parent_trx set result_code = -1 where nested_id = cur.id;
  end loop cur;
end;

关于SO的另一个例子: PL / SQL FOR LOOP IMPLICIT CURSOR

它比明确的形式更短。

这也为从CTE更新多个表提供了一个很好的解决方法。

===============>>#15 票数:0

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

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

===============>>#16 票数:-2

明确...

cursor foo是select * from blah; 当关闭光标yada yada yada时开始打开取出

不要使用它们,使用隐式

cursor foo是select * from blah;

for f in foo loop x = n.some_column end loop

我想你甚至可以做到这一点

for n in(select * from blah)loop ...

坚持隐含,他们关闭自己,他们更可读,他们让生活轻松。

  ask by Brian G translate from so

未解决问题?本站智能推荐:

5回复

Oracle中隐式和显式游标之间的区别

我想知道这两个陈述之间的区别。 这个比那个好吗 ? 和
1回复

此处所有隐式游标和显式游标都是?

隐式游标和显式游标之间的区别太混乱了……请告诉我以下给出的所有隐式游标和显式游标。 如果还有更多,还请提及... 提前致谢...!
2回复

在Oracle中循环显式游标

如何循环通过例如从查询创建的隐式游标? 以下是示例代码:
4回复

Oracle隐式游标:for-else

这是一个非常基本的问题,但是在Oracle PL / SQL FORELSE写入隐式游标的最佳方法是什么? 一些编程语言允许这种语法,当游标不返回任何行时执行FORELSE块。 我想要实现的是以下几行内容(伪代码): 我已经尝试过如下使用异常,但是NO_DATA_FOUND异常不
2回复

oracle显式游标使用的实际生活示例

我想不出在PL / SQL代码中使用显式游标的实际情况。 有人可以分享一些场景吗? 谢谢!
2回复

更新显式游标

我有一个光标,可以检索火车的行程细节。 当我循环记录时,我更新下一站的ETA(到达时间)。 该值再次用于计算该站的ETD(离开时间)。 我希望使用更新的ETA值来计算当记录获取该行程的下一个站而不是打开游标时的旧值时的ETD。 这可能吗?
2回复

在oracle中,显式游标是否将整个查询结果加载到内存中?

我有一个约有十亿行的表。 我是唯一的用户,因此在锁等方面没有争用。我注意到,当我运行类似的东西时: 在我按下Enter键的时间和输出开始流入的时间之间存在一个滞后。如果N很小,那么它就无关紧要。 对于较大的N(或没有WHERE子句),此延迟约为小时。 如您所知,我是oracle
1回复

显式游标中不允许使用序列号

我不能在显式游标中使用序列。 错误:PL / SQL:ORA-02287:此处不允许使用序列号 码: .... 我试图这样使用: 并且是相同的错误。 这是游标:
1回复

如何使用显式查询在游标中传递参数

我遇到以下proc问题。 我是PL / SQL的新手,仍然在探索。 我需要从其他表中基于last_run提取所有使用细节。 另外,日期以varchar格式存储,因此也需要解析。 请提供指针来解决此问题。 提前致谢。
3回复

显式打开和关闭游标

我一直在阅读数据库游标,而我所看到的每一段示例代码都明确地打开和关闭了游标。 我只使用过几次,所以从来没有这样做。 谁能告诉我为什么有必要这样做吗? 我知道,如果不关闭游标,则会造成内存泄漏,但是我从来没有打开过。 谢谢