发现奇怪的东西。无法理解为什么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
。不使用Count
的INTO
仅返回一行。 INTO
来使用它,它将起作用。 只是好奇它如何以及为什么在上面的查询中起作用。
奇怪的是,为什么Oracle允许使用
SELECT INTO
进行子查询,因为在通常情况下,Oracle返回编译错误ORA-06550declare 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/