关于Oracle PL SQL循环

关于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

今天做一些编码。在序列中遇到以下问题。 PL/SQL中的以下代码:

未按预期工作,即序列未按我的要求增加10-仅增加1。此代码:

很好。序列按预期递增10


这是为什么呢?

只有在第二段代码中,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

但这实际上只是一种更长、更复杂的选择方式。。。进入,因为它一次只能返回一行。

。我认为您不需要键入此代码并查看。。我希望这里有个概念性的答案。。因为,在这些图片中,我也没有提供完整的代码。。我只想知道为什么会发生这种事情为什么你要用图片替换你的代码?我想你不需要输入这些代码然后再看。。我希望这里有个概念性的答案。。因为,在这些图片中,我也没有提供完整的代码。。我只想知道为什么会发生这种事情为什么你要用图像替换代码?