【发布时间】: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 的情况下使其工作?谢谢
【问题讨论】:
我正在尝试将变量的值设置为简单选择语句的结果。
var datevar varchar(10);
exec :datevar := SELECT trunc(sysdate) from dual;
select :datevar ASOF from dual
我收到以下错误消息。我正在使用 Oracle 12c
如何在不使用 PL/SQL 的情况下使其工作?谢谢
【问题讨论】:
嗯,是的,它在 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 的情况下使其工作?
你不能。
【讨论】:
问题是您不能将查询结果应用于 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>
【讨论】: