首页 > 解决方案 > oracle游标并发插入stmt

问题描述

光标的结果是在打开时确定的?但下面的演示揭示了一个区别:

drop table Highschooler;
drop table w;
create table Highschooler( grade int );
create table w( grade int );

insert into Highschooler(grade) values (13);
insert into Highschooler(grade) values(14);
insert into Highschooler(grade) values (15);
insert into w values (16);

select * from Highschooler;
select * from w;

create or replace create function ff(a int) return int is 
   total int := 0;
begin
  select  count(grade) into total from w where grade > a ;
  return total;
end;

DECLARE
   my_var int :=0;
   my_var2 int := 0;
   my_var3 int := 0;
   CURSOR CC IS select ff(grade) from Highschooler for update;
BEGIN
   open CC;
   fetch CC into my_var;
   insert into w values (16);
   fetch CC into my_var2;
   fetch CC into my_var3;
   dbms_output.put_line(my_var || '  - '  || my_var2 || ' - ' || my_var3);
   close CC;
end;

输出:

GRADE
13
14
15
Download CSV
3 rows selected.

Result Set 4
GRADE
16
Statement processed. ------- the insert stmt in 'insert into w values (16);' affect the cursor's output here
1  - 2 - 2

标签: oracledatabase-cursor

解决方案


您的函数包含另一个光标,该光标仅在执行时打开。这就是为什么您通常不应该只使用函数来执行 SQL 的原因——您最终会得到逻辑上损坏的数据,因为每次执行都将使用不同的 SCN 点。


推荐阅读