oracle - 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
解决方案
您的函数包含另一个光标,该光标仅在执行时打开。这就是为什么您通常不应该只使用函数来执行 SQL 的原因——您最终会得到逻辑上损坏的数据,因为每次执行都将使用不同的 SCN 点。
推荐阅读
- mobx - 处理 mobx 中的输入变化
- php - 刷新div后Popover停止工作?
- python - 使用 python 或 bash 在多行文件中查找和替换模式
- php - 使用 ajax 在循环中填充表单字段
- javascript - 字符串文字第一个还是第二个串联?
- c# - Unity 中的浮动文本
- ruby-on-rails - 使用简单的 for 选择并保存多个复选框
- ruby-on-rails - 多态 has_and_belongs_to_many
- python - 如何根据部分字符串匹配加入两个数据框?
- python - 如何仅针对 Tensorflow 中的给定索引将矩阵乘以标量?