我有一个相当复杂的查询,它将在整个过程中多次引用一个日期作为开始或停止日期。我将不得不在3个不同的会计年度运行此查询,并且不希望在整个查询期间更改日期17次。
有没有办法在我的查询开头设置一个变量并引用它?我不打算编写一个完整的函数,只是在我的查询中引用一个变量。
答案 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的;