sql - 甲骨文。无法理解 FOR 如何与子查询 SELECT INTO 一起使用

标签 sql oracle plsql

发现奇怪的事情。无法理解为什么 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) 返回非空值

我当然明白:

  1. 在这种情况下不需要 FOR 。没有 INTOCount 仅返回一行。
  2. 我可以在没有 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/

相关文章:

sql - Jython 使用 FDMApi 从 SQL 获取值

oracle - 在Oracle中创建备份表触发器

mysql - 向 DateTime 列的日期部分添加唯一约束

sql - PostgreSQL 函数进行计算然后填充表

mysql - SQL 查询。连接但在一张表中,每个元组出现 2 次连接属性

mysql - 来自 .CSV 的 'LOAD DATA INFILE' 警告 - 整数和日期

xml - 如何在 US7ASCII Oracle 数据库的 UTF8 xml 文件中写入非 ascii 字符

java - 使用jdbc在Oracle sql中过滤特定日期范围内的数据

sql - Oracle PL/SQL : Function Error when passing parameters

sql - Oracle 带参数的存储过程