如何从pl sql过程运行sql脚本

时间:2011-01-23 05:35:55

标签: sql oracle plsql

我有一个类似的程序:

CREATE OR REPLACE PROCEDURE test is 
BEGIN

  DBMS_OUTPUT.PUT_LINE('This is a Test');
END;

我想运行一些存储在当前目录中的sql脚本。 我可以使用'@ scriptname.sql'从sqlplus运行它们,但是如何从程序中执行此操作?例如:

CREATE OR REPLACE PROCEDURE test is 
BEGIN

  DBMS_OUTPUT.PUT_LINE('This is a Test');
  @scriptname.sql

END;

这似乎不起作用!是否有特定的从pl / sql程序运行sql脚本?

5 个答案:

答案 0 :(得分:11)

通常,您不能因为pl / sql在服务器上的数据库中运行,而sqlplus是客户端进程。服务器甚至不能依赖于与客户端及其文件在同一系统上,更不用说了解如何查找客户端所指的文件。即使支持语法(并且不支持),您的sql脚本也必须位于服务器上,服务器知道并且可以访问的位置。

答案 1 :(得分:8)

实际上,可以在SQL * Plus中执行此操作 - 您只需要确保@是该行的第一个字符,例如:

CREATE OR REPLACE PROCEDURE test is 
BEGIN

    DBMS_OUTPUT.PUT_LINE('This is a Test');
@scriptname.sql

END;

SQL * Plus将读取脚本的全部内容并在过程中的该点插入,然后按照给定的过程创建过程。这意味着您无法在scriptname.sql中拥有SQL * Plus命令。此外,在数据库上创建的实际过程中不会引用@ scriptname.sql。

答案 2 :(得分:4)

您可以执行OS命令来启动SQLPlus并执行脚本。您可以在启动时将文件名传递给SQLplus,它将执行它。

Google外部程序和extproc或this article。或类似call OS command with Java

之类的东西

答案 3 :(得分:1)

您可以编写Java Stored Procedure来打开文件并将其内容作为String返回,然后在String上调用Execute Immediate

非常小心这样做,因为这些文件中的任何恶意sql都可以做任何想做的事情。

答案 4 :(得分:1)

即使应该有解决方案,我也不建议这样做。 PL / SQL过程基本上是一个SQL脚本。或 1.从数据库外部运行SQL脚本,例如通过shell脚本或 2.在程序中移动SQL代码。