我正在尝试调用变量脚本名称。我需要将其作为变量,以便可以将其替换为参数。下面的这段代码某种程度上是行不通的。
DECLARE
mypath CHAR(30);
BEGIN
mypath := '&1';
@mypath
END;
请帮忙!
答案 0 :(得分:0)
PL / SQL 脚本是 Sqlplus 脚本的子集。换句话说,您无法从 PL / SQL 块内部运行PROMPT hello
。
尽管有一种方法可以运行存储在 PL / SQL 块中的文件中的纯 PL / SQL 脚本,但我不建议这样做,因为有些考虑您可以找到更清晰的解决方案。
无论如何,这是肮脏的骇客:
my/lovely/little_script_1.sql
BEGIN
dbms_output.put_line('hello from little_script_1');
END;
--------------------
my/lovely/little_script_2.sql
BEGIN
dbms_output.put_line('hello from little_script_2');
END;
--------------------
@main.sql
DECLARE
v_file_contents varchar2(32767) := q'[
@&1
]';
BEGIN
EXECUTE IMMEDIATE v_file_contents
END;
/
--------------------
@run.sql
set serveroutput on
@main.sql my/lovely/little_script_1.sql
@main.sql my/lovely/little_script_2.sql
--------------------
sqlplus user/pass@DB @run.sql
请注意,little_script*
个文件是纯PL/SQL
,尤其是它们最后没有/
符号。
重要的是要理解,如果仅@file_name.sql
是行中的第一个非空格字符,则无论该结构放置在何处,结构@
会将文件内容内联到当前脚本中。即使在PL / SQL内部,它也可以发生-这是一个未记录的功能(或永远无法修复的错误)。
因此,替换@main.sql my/lovely/little_script_1.sql
的隐式结果将是:
DECLARE
v_file_contents varchar2(32767) := q'[
BEGIN
dbms_output.put_line('hello from little_script_1');
END;
]';
BEGIN
EXECUTE IMMEDIATE v_file_contents
END;
由于仅按原样内联文件内容,因此请注意正确处理引号。
例如,如果little_script_1.sql
在任何地方都包含字符串终止符]'
,那么main.sql
将面临语法错误-请自己尝试。
答案 1 :(得分:0)
回声 将行设置为200页999,对进纸时的回声进行修整,按时进行计时
假脱机'&1'
@'&2'
假脱机 假脱机“&1” APPEND
声明
myoption CHAR(1);
开始
myoption:='&Do_you_want_to_commit_y_n';
如果myoption ='y'则Q 提交;
其他 回滚;
如果结束,
END; /
假脱机 关闭回声 退出;