发现奇怪的事情。无法理解为什么 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)
返回非空值
我当然明白:
- 在这种情况下不需要
FOR
。没有INTO
的Count
仅返回一行。 - 我可以在没有
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 值?
最佳答案
正确的sql语句
试试这个
declare cnt number;
begin
for r in (Select count(1) as cnt from v$session) loop
dbms_output.put_line(r.cnt);
END LOOP;
end;
说明
select_statement
SQL SELECT 语句(不是 PL/SQL SELECT INTO 语句)。对于 select_statement,PL/SQL 声明、打开、获取和关闭隐式游标。但是,由于 select_statement 不是一个独立的语句,因此隐式游标是内部的 — 您不能使用名称 SQL 来引用它。
参见http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/cursor_for_loop_statement.htm#LNPLS1155
cnt
变量被忽略,这可以通过以下示例证明,因为不会引发错误:
declare
cnt number;
a_varchar varchar2(1);
begin
for r in (Select 'AA' into a_varchar from v$session) loop
dbms_output.put_line(a_varchar);
end loop;
end;
关于sql - 甲骨文。无法理解 FOR 如何与子查询 SELECT INTO 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33143397/