oracle如何关闭游标?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle如何关闭游标?相关的知识,希望对你有一定的参考价值。

1. 用open打开的,用close关闭
declare
cursor mycursor is
select * from emp for update;
myrecord emp%rowtype;
begin
open mycursor;
loop
fetch mycursor into myrecord;
exit when mycursor%notfound;
if (myrecord.sal=2000) then
update emp
set sal=2001
where current of mycursor;
end if;
end loop;
close mycursor;
commit;
end;
2. 用for 循环的,循环完了就自己关了
declare
cursor mycursor is
select * from emp;
begin
for i in mycursor
loop
dbms_output.put_line(i.job);
end loop;
end;
参考技术A

第一,如果游标以open打开的,则使用close关闭:


declare;

cursor mycursor is;

select * from emp for update;

myrecord emp%rowtype;

begin

open mycursor;

loop

fetch mycursor into myrecord;

exit when mycursor%notfound;

if (myrecord.sal=2000) then

update emp

set sal=2018

where current of mycursor;

end if;

end loop;

close mycursor;

commit;

end;

第二,使用for 循环的,则循环结束游标自动关闭:

declare

cursor mycursor is

select * from emp;

begin

for i in mycursor

loop

dbms_output.put_line(i.job);

end loop;

end;

oracle游标是数据库中一个命名的工作区,当游标被声明后,他就与一个固定的SQL想关联,在编译时刻是已知的,是静态的.它永远指向一个相同的查询工作区。

游标变量可以在运行时刻与不同的SQL语句关联,在运行时可以取不同的SQL语句.它可以引用不同的工作区。

oracle游标和游标变量是不能相互代替的。如何定义游标类型:

TYPE ref_type_name IS REF CURSOR [RETURN return_type];

声明游标变量:

cursor_name ref_type_name;

如何在oracle中使用嵌套游标遍历同一张表[关闭]

【中文标题】如何在oracle中使用嵌套游标遍历同一张表[关闭]【英文标题】:How to traverse the same table with nested cursors in oracle [closed] 【发布时间】:2021-01-18 22:51:34 【问题描述】:

我遇到了一个 oracle 过程的问题,该过程使用两个嵌套游标循环同一个表。

从概念上讲,我有一个包含十列的表,从一到十编号。

第 1 列必须始终包含数据,因为它是主键。 第 10 列可能有数据,也可能没有数据,就像子列一样,如果没有数据,则为父记录,否则为子记录。

我需要在两个不同的表中插入父记录,而只在其中一个表中插入子记录。

为此,我创建了两个游标,一个选择父记录,另一个只选择子记录。

我将第 1 列(出现在子记录的第 10 列中)的值作为参数传递给第二个光标。

问题是它在完成第一个游标之前不会进入第二个游标,我需要它从第一个游标读取记录,输入第二个游标,读取存在的游标,然后返回到第一个游标。

谁能帮我解决这个问题?

从现在开始,感谢您的关注。

【问题讨论】:

请edit 使用minimal reproducible example 提出您的问题,包括:表和过程的DDL(CREATE TABLECREATE PROCEDURE)语句(请使其MINIMAL ,所以如果你可以做一个 3 列而不是 10 列的例子,那会很好);一些示例数据的 DML (INSERT) 语句可以证明问题;详细说明您希望如何转换该样本数据;您的预期输出。发布没有任何代码的问题会使我们很难知道我们是否在回答您认为您在问的问题;所以让它更容易,给我们一个例子。 在第一步中,如果您可以在没有光标的情况下解决它,请考虑一下。 【参考方案1】:

试试这样的:

begin

  for c in (select * from child_table) loop
  
    insert into table1
      select * from parent_table where column_1 = c.column_10;
  
    insert into table2
      select * from parent_table where column_1 = c.column_10;
  
    insert into table3
      (column_1,
       column_2,
       column_3,
       column_4,
       column_5,
       column_6,
       column_7,
       column_8,
       column_9,
       column_10)
    values
      (c.column_1,
       c.column_2,
       c.column_3,
       c.column_4,
       c.column_5,
       c.column_6,
       c.column_7,
       c.column_8,
       c.column_9,
       c.column_10);
  end loop;
end;

【讨论】:

以上是关于oracle如何关闭游标?的主要内容,如果未能解决你的问题,请参考以下文章

如何在oracle中使用嵌套游标遍历同一张表[关闭]

oracle的游标cursor

游标使用后要关闭,然后要释放吗?

快速掌握Oracle数据库游标的使用方法有哪些?

Oracle游标使用总结

Oracle游标