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

当SQL语句没有显式游标时,只要执行SQL语句,Oracle就会自动创建合法游标。程序员无法控制隐式游标及其信息,oracle,plsql,Oracle,Plsql,显式游标: 显式游标是程序员定义的游标,用于获得对上下文区域的更多控制。应在PL/SQL块的声明部分中定义显式游标。它是在返回多行的SELECT语句上创建的 创建显式游标的语法为: CURSOR cursor_name IS select_statement; 功能上有什么不同吗?完全重复:你所指的“重复”并没有解释问题的第一部分:“什么是光标”。这个答案很好,有很多细节和片段。谢谢这个答案是好的,我会投赞成票,只是它说隐式游标效率低,这是错误的——事实上,在适当的情况下,隐式游标通常比显式

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

创建显式游标的语法为:

CURSOR cursor_name IS select_statement; 

功能上有什么不同吗?完全重复:你所指的“重复”并没有解释问题的第一部分:“什么是光标”。这个答案很好,有很多细节和片段。谢谢这个答案是好的,我会投赞成票,只是它说隐式游标效率低,这是错误的——事实上,在适当的情况下,隐式游标通常比显式游标效率更高-1因为效率低下的原因是错误的,因为一些7.x版本和易受数据错误影响的漏洞在我看来是一件好事。如果您希望得到一行,但得到两行,则最好出现“太多行”异常。性能比较表明,隐式运算速度快了两倍:更好;)
DECLARE 
CURSOR cur IS 
  SELECT columns FROM table WHERE condition;
BEGIN
...
...
BEGIN
   SELECT columns INTO variables FROM table where condition;
END;
...
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;
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;
/
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;
/
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;
SQL> DECLARE
  2    l_loops  NUMBER := 100000;
  3    l_dummy  dual.dummy%TYPE;
  4    l_start  NUMBER;
  5    -- explicit cursor declaration
  6    CURSOR c_dual IS
  7      SELECT dummy
  8      FROM   dual;
  9  BEGIN
 10    l_start := DBMS_UTILITY.get_time;
 11    -- explicitly open, fetch and close the cursor
 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    -- implicit cursor for loop
 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.
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;
CURSOR cursor_name IS select_statement;