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