如何在 Oracle SQL 中将变量设置为 select 语句的结果

Posted

技术标签:

【中文标题】如何在 Oracle SQL 中将变量设置为 select 语句的结果【英文标题】:How to set a variable to the result of a select statement in Oracle SQL 【发布时间】:2020-07-21 06:43:40 【问题描述】:

我正在尝试将变量的值设置为简单选择语句的结果。

var datevar varchar(10);
exec :datevar := SELECT trunc(sysdate) from dual;
select :datevar ASOF from dual

我收到以下错误消息。我正在使用 Oracle 12c

如何在不使用 PL/SQL 的情况下使其工作?谢谢

【问题讨论】:

【参考方案1】:

嗯,是的,它在 SQL 层不起作用,但在 PL/SQL 中可以。在 SQL*Plus 中,您可以使用 exec(如您所知)。它有点“取代”begin-end,让您输入的字母比平时少一些。

因此,在您的示例中:因为它是 PL/SQL,所以您需要 INTO 子句:

SQL> var datevar varchar2(10);
SQL> exec select trunc(sysdate) into :datevar from dual;   --> note INTO

PL/SQL procedure successfully completed.

SQL> print datevar

DATEVAR
--------------------------------
21.07.2020

SQL>

exec 的实际作用是

SQL> begin                                               --> behind the scene, EXEC encloses 
  2    select trunc(sysdate) into :datevar from dual;    --> your statement into
  3  end;                                                --> BEGIN - END
  4  /

PL/SQL procedure successfully completed.

SQL> print datevar

DATEVAR
--------------------------------
21.07.2020

SQL>

最后,回答你的问题:

如何在不使用 PL/SQL 的情况下使其工作?

你不能。

【讨论】:

感谢您的反馈。【参考方案2】:

问题是您不能将查询结果应用于 sqlplus 中的变量。

SQL> var datevar varchar(10);
SQL> exec :datevar := '20200721' ;
SQL> select :datevar from dual ;

:DATEVAR
--------------------------------
20200721

您还可以将它们应用于 where 条件的过滤器

SQL> variable v1 varchar2(20)
SQL> exec :v1 := '2015/12/22';
PL/SQL procedure successfully completed.

SQL> select 1 as result from dual where to_date(:v1, 'yyyy/mm/dd') < sysdate;

    RESULT
----------
         1

但是如果你需要动态地给一个变量赋值,你需要PL/SQL。哪个是正确的方法

SQL> set serveroutput on
SQL>  declare
 my_var varchar2(10);
 begin
 select trunc(sysdate) into my_var from dual;
 dbms_output.put_line ( my_var );
 end;
 /  

21-JUL-20

PL/SQL procedure successfully completed.

SQL>

【讨论】:

你能接受这个答案吗?将不胜感激

以上是关于如何在 Oracle SQL 中将变量设置为 select 语句的结果的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle SQL 中将结果限制为 1 行 [重复]

ORACLE SQL:如何在 Pivot 函数中将 NULL 替换为 0

如何在 oracle 存储过程中将对象类型设置为 out?

如何在sql中将数字转换为日期

如何在Oracle sql中将行转换为按多列分组的列[关闭]

在 Oracle SQL 中将数据透视表转换为平面表