发现奇怪的东西。无法理解为什么Oracle允许此查询,以及为什么cnt变量在执行后不改变:

declare cnt number;
begin
 for r in (Select count(1) into cnt from  v$session) loop
   dbms_output.put_line(cnt);
 END LOOP;
end;
Select count(1) from v$session返回非空值

我当然知道:
  • 在这种情况下不需要FOR。不使用CountINTO仅返回一行。
  • 我可以不用INTO来使用它,它将起作用。

  • 只是好奇它如何以及为什么在上面的查询中起作用。

    奇怪的是,为什么Oracle允许使用SELECT INTO进行子查询,因为在通常情况下,Oracle返回编译错误ORA-06550
    declare cnt number;
     begin
            select count(1) from  (Select count(1) into cnt from  v$session)
     end;
    or
    

    如果第一个查询有效-为什么它不能正确返回cnt值?

    最佳答案

    非常有趣,我想说这是一个错误,但它是一个良性的错误。 INTO cnt位是有效的PL/SQL,但是在这种情况下会被忽略,这可以通过一个简单的测试用例来证明:

    declare cnt number;
    begin
     for r in (select count(1) into cnt from dual) loop
       dbms_output.put_line('cnt=' || cnt);
       dbms_output.put_line('r=' || r."COUNT(1)");
     end loop;
    end;
    

    如您所见,INTO子句被忽略,并且按预期方式,正确填充了r记录。在我的11gR2实例上的输出:
    cnt=
    r=1
    

    关于sql - 甲骨文。无法理解FOR如何与子查询SELECT INTO一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33143397/

    10-13 03:46