sql – Oracle.无法理解FOR如何使用子查询SELECT INTO

发现奇怪的事情.无法理解为什么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;

从v $session中选择count(1)返回not null值

我当然明白了:

>在这种情况下,FOR不需要.没有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

如果第一个查询有效 – 为什么它不能正确返回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

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03