在PL / SQL中调用另一个脚本

时间:2018-08-07 14:23:07

标签: plsql plsqldeveloper

我正在尝试调用变量脚本名称。我需要将其作为变量,以便可以将其替换为参数。下面的这段代码某种程度上是行不通的。

DECLARE
    mypath CHAR(30);
BEGIN
    mypath := '&1'; 
    @mypath
END;

请帮忙!

2 个答案:

答案 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; /

假脱机 关闭回声 退出;