发现奇怪的事情.无法理解为什么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;
Run Code Online (Sandbox Code Playgroud)
Select count(1) from v$session 返回非空值
我当然明白了:
FOR并不需要在这种情况下.Count没有INTO返回只有一行.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
Run Code Online (Sandbox Code Playgroud)
如果第一个查询有效 - 为什么它不能正确返回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;
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,该INTO子句被忽略,并且正如预期的那样,r记录已正确填充。我的 11gR2 实例上的输出:
cnt=
r=1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
147 次 |
| 最近记录: |