使用不同的参数运行oracle SQL脚本两次

时间:2016-09-26 10:58:44

标签: sql oracle sql-scripts

我在Oracle SQL开发人员中有一个SQL语句,它有一些变量:

DEFINE custom_date = "'22-JUL-2016'" --run1
DEFINE custom_date = "'25-JUL-2016'" --run2

SELECT * FROM TABLE WHERE date=&custom_date

真正的查询要复杂得多,并且有更多变量,并且根据查询结果创建新表。如何创建脚本以便查询执行两次,第一次将自定义日期设置为第一行,第二次设置为第二行。

2 个答案:

答案 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对结果没有任何作用,但它当然应该执行你的查询两次,使用不同的参数。