我有一个类似的程序:
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脚本?
答案 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代码。