【问题标题】:Pass a variable from one sql script to another as parameter将变量从一个 sql 脚本传递到另一个作为参数
【发布时间】:2019-11-03 04:39:50
【问题描述】:

我正在尝试从另一个脚本调用 sql 脚本,但在尝试将变量作为参数传递时遇到了一些问题。

定义常量时,我​​可以这样传递:

DEFINE MY_PARAM = "test"
BEGIN
    @mysqlscript.sql "&MY_PARAM"
END;
/

但是我想用变量调用脚本,应该是这样的:

DECLARE 
v_MY_PARAM VARCHAR(32) := 'test'
BEGIN
    @mysqlscript.sql :V_MY_PARAM
END;
/

我尝试了不同的方法(即"&V_MY_PARAM"'&V_MY_PARAM'':V_MY_PARAM',...),但到目前为止没有运气。

【问题讨论】:

    标签: database oracle plsql oracle12c


    【解决方案1】:

    从变量中获取值到DEFINE 有点麻烦,需要一个复杂的过程。 在 SQL*Plus 中创建一个绑定变量,然后做任何你想做的事情,将一个值放入该绑定变量。 现在,使用带有NEW_VALUECOLUMN 命令来定义一个列和一个它将进入的define 变量。 然后使用SELECT 将绑定变量放入新的define 变量中。

    您可能希望添加一些 SQL*Plus 调整以最小化其中一些活动的输出。

    试一试:

    脚本.sql

    set serveroutput on size unlimited
    
    -- use a bind variable defined at SQL*Plus level for this
    variable v_MY_PARAM VARCHAR2(32)
    
    BEGIN
        -- can use SELECT to do this too
        :v_MY_PARAM := 'test';
    END;
    /
    
    -- Here is the magic that converts a bind variable to a DEFINE variable
    column mycol new_value myvar
    select :v_MY_PARAM as mycol from dual;
    
    BEGIN
        @mysqlscript.sql &myvar
    END;
    /
    

    mysqlscript.sql

    dbms_output.put_line('Working? &1');
    -- But wait!!!
    dbms_output.put_line('This works too: ' || :v_MY_PARAM);
    

    第一个选项使用适当的参数,作为 SQL*Plus 定义处理,逐字交换。

    第二个选项直接在第二个文件中使用绑定变量。绑定变量对于 SQL*Plus 是全局的,并且可以被所有脚本看到。第二种方法的缺点是您的第二个脚本需要知道绑定变量的名称,并且可能与调用者过于紧密地耦合。最好使用上述命令行参数方法。

    【讨论】:

    • 谢谢,我花了很长时间才找到它 :-)
    • 他们是否可以使用 postgres sql 文件将变量从一个 sql 脚本传递到另一个作为参数。
    猜你喜欢
    • 1970-01-01
    • 2020-06-09
    • 2011-02-08
    • 2013-10-23
    • 2017-11-07
    • 2012-04-04
    • 2012-11-15
    • 2014-07-01
    • 1970-01-01
    相关资源
    最近更新 更多