将变量从一个SQL脚本传递到另一个作为参数

时间:2019-06-20 11:04:52

标签: database oracle plsql oracle12c

我试图从另一个脚本调用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'等),但到目前为止没有运气。

1 个答案:

答案 0 :(得分:1)

从变量获取值到DEFINE有点麻烦,并且需要复杂的过程。 在SQL * Plus中创建一个绑定变量,然后执行要在该绑定变量中获取值的任何操作。 现在,将COLUMN命令和NEW_VALUE一起使用,以定义要输入的列和变量define。 然后使用SELECT将绑定变量放入新的define变量中。

您可能希望添加一些SQL * Plus调整,以最大程度地减少其中一些活动的输出。

这是一个尝试:

script.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;
/

myscript.sql

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

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

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