我试图从另一个脚本调用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'
等),但到目前为止没有运气。
答案 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的全局变量,可以在所有脚本中看到。第二种方法的缺点是您的第二个脚本需要知道绑定变量的名称,并且可能与调用者联系太紧密。最好使用上面概述的命令行参数方法。