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

fzwojiic  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(357)

我试图将一个变量的值设置为一个简单select语句的结果。

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

我得到下面的错误信息。我在和甲骨文12c合作

如果不使用pl/sql,我如何让它工作?谢谢

xoefb8l8

xoefb8l81#

嗯,是的,它在sql层中不起作用,但在pl/sql中会起作用。在sql*中,还有 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,我如何让它工作?
你不能。

aor9mmx1

aor9mmx12#

问题是不能将查询结果应用于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>

相关问题