【问题标题】:How to set a variable to the result of a select statement in Oracle SQL如何在 Oracle SQL 中将变量设置为 select 语句的结果
【发布时间】: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 的情况下使其工作?谢谢

【问题讨论】:

    标签: sql database oracle


    【解决方案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>
    

    【讨论】:

    • 你能接受这个答案吗?将不胜感激
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 2012-06-29
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多