带变量的PL / SQL查询

时间:2009-11-19 23:00:54

标签: sql oracle variables plsql

我有一个相当复杂的查询,它将在整个过程中多次引用一个日期作为开始或停止日期。我将不得不在3个不同的会计年度运行此查询,并且不希望在整个查询期间更改日期17次。

有没有办法在我的查询开头设置一个变量并引用它?我不打算编写一个完整的函数,只是在我的查询中引用一个变量。

4 个答案:

答案 0 :(得分:3)

是的,取决于你想要的方式。

您可以使用匿名程序IE:

BEGIN

   v_date DATE := TO_DATE(your_date, your_date_mask);

   [your query referencing v_date where ever you need];

END;

或者,如果在SQLPlus中运行查询,则使用&来记录变量(IE:& your_date),并在运行脚本时提示输入值。

答案 1 :(得分:3)

正如OMG Ponies所说,在PL / SQL中,只要是静态SQL,就可以直接在SQL中引用任何PL / SQL变量(包括参数)。在PL / SQL之外,或者如果您的SQL是动态的(因为本机动态SQL至少从10g开始不支持可重用的命名参数),您可以使用以下技巧。在查询中的WHERE子句之前添加以下内容:

CROSS JOIN (SELECT :dateparam Mydate FROM dual) Dateview

无论您想在主查询中引用该值,请将其命名为Dateview.Mydate然后,当您执行查询时,只需传入一个绑定参数。

答案 2 :(得分:2)

你并没有真正说出你如何引用它,所以我只是从SQL * Plus的角度来展示。

两种方式

让它提示您输入值。由于您多次使用相同的变量,因此您需要使用&&操作


    SQL> SELECT &&var, &&var FROM Dual;
    Enter value for var: 'PUMPKIN'
    old   1: SELECT &&var, &&var FROM Dual
    new   1: SELECT 'PUMPKIN', 'PUMPKIN' FROM Dual

    'PUMPKI 'PUMPKI
    ------- -------
    PUMPKIN PUMPKIN

或者,您可以在运行SQL之前进行设置。


    SQL> VARIABLE new_var VARCHAR2(20);
    SQL> EXECUTE :new_var := 'PUMPKIN PIE';

    PL/SQL procedure successfully completed.

    SQL> SELECT :new_var, :new_var FROM DUAL;

    :NEW_VAR                         :NEW_VAR
    -------------------------------- --------------------------------
    PUMPKIN PIE                      PUMPKIN PIE

答案 3 :(得分:0)

如果您使用带有第二个鼠标按钮的Toad - >作为脚本执行,因此不会提示您输入值:

  

var myVar varchar2(20);

     

exec:req:='x';

     

从MYTable中删除Field =   :myVar的;