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

Plsql 在PL/SQL中调用另一个脚本,plsql,plsqldeveloper,Plsql,Plsqldeveloper,我试图调用一个变量脚本名。我需要它作为一个变量,这样我就可以用一个参数来替换它。下面的代码不知何故不起作用 DECLARE mypath CHAR(30); BEGIN mypath := '&1'; @mypath END; 请帮忙 PL/SQL脚本是Sqlplus脚本的子集。换句话说,您不能从PL/SQL块内部运行提示符hello 虽然有一种方法可以从PL/SQL块运行存储在文件中的纯PL/SQL脚本,但我不建议这样做,因为只要稍微考虑一下,就可以找到更清

我试图调用一个变量脚本名。我需要它作为一个变量,这样我就可以用一个参数来替换它。下面的代码不知何故不起作用

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

PL/SQL脚本是Sqlplus脚本的子集。换句话说,您不能从PL/SQL块内部运行
提示符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\u name.sql
将文件内容内联到当前脚本中非常重要,只要
@
是行中的第一个非空格字符,而不管该构造放置在何处。它甚至在PL/SQL内部也会发生——这是一个未记录的特性(或者是一个永远不会被修复的bug)

因此,替换
@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\u script_1.sql
包含字符串终止符符号
]'
,则
main.sql
将面临语法错误-请自己尝试

回音打开 设置行200页999修剪在echo on feed on上定时在time on上

假脱机'&1'

@“&2”

关闭 假脱机'&1'附加

申报

myoption-CHAR(1)

开始

myoption:='&您想提交吗

如果myoption='y'那么q 承诺

否则 回滚

如果结束

结束; /

关闭 激起回声
退出

您将无法从PL/SQL中运行shell脚本;至少没有一些严格的编码技巧和系统特权。你希望完成什么?斯蒂尔加的复制品是正确的。你可以,但你不应该这样做。告诉我们您想要做什么..我想在pl/sql中调用一个sql脚本。我可以这样嵌入文件名和路径@my_script.sql,但我的问题是文件名不是静态的,这意味着它可以更改。这就是我需要它作为变量的原因。如何运行脚本?如果使用Toad,您可以放置如下变量:
:myvar
,Toad将要求您输入。谢谢!我被这肮脏的黑客吓了一跳呵呵。不管怎样,我得到了一个不同的解决方案,这要容易得多。让我在下面演示:@'&2'是变量参数sql文件。这是一个插入DML。接下来的代码是PL/SQL块,它将要求用户提交或回滚。