我在Oracle SQL开发人员中有一个SQL语句,它有一些变量:
DEFINE custom_date = "'22-JUL-2016'" --run1
DEFINE custom_date = "'25-JUL-2016'" --run2
SELECT * FROM TABLE WHERE date=&custom_date
真正的查询要复杂得多,并且有更多变量,并且根据查询结果创建新表。如何创建脚本以便查询执行两次,第一次将自定义日期设置为第一行,第二次设置为第二行。
答案 0 :(得分:1)
在Oracle中,&variable
是"替换变量"并且不是SQL的一部分;它是SQL * Plus脚本语言的一部分(由SQL Developer,Toad等理解)
更好的选择,以及你所询问的是BIND VARIABLES。符号为:variable
(带冒号:而不是&),例如:custom_date
。
不同之处在于,在将查询发送到适当的Oracle引擎之前,替换变量将替换为前端应用程序(在您的情况下为SQL Developer)中的值。绑定变量在运行时被替换。这有几个好处;讨论它们超出了你的问题的范围。
在SQL Developer中使用绑定变量执行查询时,程序将打开一个窗口,您可以在其中输入绑定变量的所需值。您将不得不尝试一下,直到您可以使它工作(例如,我永远不会记得是否必须使用单引号输入日期或不使用)。祝你好运!
答案 1 :(得分:0)
定义用于TRANSACT SQL。要以Oracle方式执行此操作,您可以创建anonymus PL / SQL块,类似于:
DECLARE
p_param1 DATE;
p_param2 NUMBER;
CURSOR c_cur1(cp_param1 DATE,cp_param2 NUMBER)
IS
SELECT * FROM table WHERE date = cp_param1
;
BEGIN
-- Execute it first time
p_param1 := TO_DATE('2016-09-01','YYYY-MM-DD');
FOR r IN c_cur1(p_param1)
LOOP
NULL;
END LOOP;
-- Execute it second time
p_param1 := TO_DATE('2015-10-11','YYYY-MM-DD');
FOR r IN c_cur1(p_param1)
LOOP
NULL;
END LOOP;
END;
在其中,您使用参数创建游标并使用不同的参数执行两次。 我不知道你为什么要执行这个查询两次,所以脚本abowe对结果没有任何作用,但它当然应该执行你的查询两次,使用不同的参数。