关于Oracle PL SQL循环
今天做一些编码。在序列中遇到以下问题。 PL/SQL中的以下代码: 未按预期工作,即序列未按我的要求增加10-仅增加1。此代码: 很好。序列按预期递增10关于Oracle PL SQL循环,oracle,loops,plsql,database-sequence,Oracle,Loops,Plsql,Database Sequence,今天做一些编码。在序列中遇到以下问题。 PL/SQL中的以下代码: 未按预期工作,即序列未按我的要求增加10-仅增加1。此代码: 很好。序列按预期递增10 这是为什么呢?只有在第二段代码中,nextval才执行了10次,因为nextval在循环中被调用 这是导致增量的原因 NEXTVAL:递增序列并返回下一个值 第一个代码调用nextval一次并将值存储在游标中,然后相同的值在循环中更新10次只有第二个代码执行nextval 10次,因为nextval在循环中被调用 这是导致增量的原因 NE
这是为什么呢?只有在第二段代码中,nextval才执行了10次,因为nextval在循环中被调用 这是导致增量的原因 NEXTVAL:递增序列并返回下一个值
第一个代码调用nextval一次并将值存储在游标中,然后相同的值在循环中更新10次只有第二个代码执行nextval 10次,因为nextval在循环中被调用 这是导致增量的原因 NEXTVAL:递增序列并返回下一个值
第一个代码调用nextval一次并将值存储在cursor中,然后相同的值在循环中更新10次通过添加一些调试可以看到发生了什么:
create sequence s42;
set serveroutput on
declare
cursor c is
select s42.nextval from dual;
n pls_integer;
begin
open c;
for i in 1..5 loop
fetch c into n;
dbms_output.put_line('i: ' || i
|| '; n: ' || n
|| '; found: ' || case when c%found then 'true' else 'false' end);
end loop;
close c;
end;
/
i: 1; n: 1; found: true
i: 2; n: 1; found: false
i: 3; n: 1; found: false
i: 4; n: 1; found: false
i: 5; n: 1; found: false
PL/SQL procedure successfully completed.
只打开光标一次,光标只返回一行。因此,第一次获取会找到一个值(c%found
为true)。第二次和后续回迁找不到行,因为单行结果集已用尽
简而言之,nextval
只执行一次,因此序列只递增一次
在第二个版本中,整个查询在循环中重新执行,因此多次调用nextval
,因此序列也会多次递增
如果在循环中重新打开光标,则会看到相同的结果:
declare
cursor c is
select s42.nextval from dual;
n pls_integer;
begin
for i in 1..5 loop
open c;
fetch c into n;
dbms_output.put_line('i: ' || i
|| '; n: ' || n
|| '; found: ' || case when c%found then 'true' else 'false' end);
close c;
end loop;
end;
/
i: 1; n: 2; found: true
i: 2; n: 3; found: true
i: 3; n: 4; found: true
i: 4; n: 5; found: true
i: 5; n: 6; found: true
但这实际上只是一种更长、更复杂的选择方式。。。进入,因为它一次只能返回一行。您可以通过添加一些调试来查看发生了什么:
create sequence s42;
set serveroutput on
declare
cursor c is
select s42.nextval from dual;
n pls_integer;
begin
open c;
for i in 1..5 loop
fetch c into n;
dbms_output.put_line('i: ' || i
|| '; n: ' || n
|| '; found: ' || case when c%found then 'true' else 'false' end);
end loop;
close c;
end;
/
i: 1; n: 1; found: true
i: 2; n: 1; found: false
i: 3; n: 1; found: false
i: 4; n: 1; found: false
i: 5; n: 1; found: false
PL/SQL procedure successfully completed.
只打开光标一次,光标只返回一行。因此,第一次获取会找到一个值(c%found
为true)。第二次和后续回迁找不到行,因为单行结果集已用尽
简而言之,nextval
只执行一次,因此序列只递增一次
在第二个版本中,整个查询在循环中重新执行,因此多次调用nextval
,因此序列也会多次递增
如果在循环中重新打开光标,则会看到相同的结果:
declare
cursor c is
select s42.nextval from dual;
n pls_integer;
begin
for i in 1..5 loop
open c;
fetch c into n;
dbms_output.put_line('i: ' || i
|| '; n: ' || n
|| '; found: ' || case when c%found then 'true' else 'false' end);
close c;
end loop;
end;
/
i: 1; n: 2; found: true
i: 2; n: 3; found: true
i: 3; n: 4; found: true
i: 4; n: 5; found: true
i: 5; n: 6; found: true
但这实际上只是一种更长、更复杂的选择方式。。。进入,因为它一次只能返回一行。。我认为您不需要键入此代码并查看。。我希望这里有个概念性的答案。。因为,在这些图片中,我也没有提供完整的代码。。我只想知道为什么会发生这种事情为什么你要用图片替换你的代码?我想你不需要输入这些代码然后再看。。我希望这里有个概念性的答案。。因为,在这些图片中,我也没有提供完整的代码。。我只想知道为什么会发生这种事情为什么你要用图像替换代码?