簡體   English   中英

如何從pl sql過程運行sql腳本

[英]How to run sql scripts from a pl sql procedure

我有一個程序,如:

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腳本?

通常,您不能因為pl / sql在服務器上的數據庫中運行,而sqlplus是客戶端進程。 服務器甚至不能依賴於與客戶端及其文件在同一系統上,更不用說了解如何查找客戶端所指的文件。 即使支持語法(並且不支持),您的sql腳本也必須位於服務器上,服務器知道並有權訪問的位置。

實際上,您可以在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。

您可以執行OS命令來啟動SQLPlus並執行腳本。 您可以在啟動時將文件名傳遞給SQLplus,它將執行它。

Google外部程序和extproc或本文 或者類似於使用Java調用OS命令

您可以編寫Java存儲過程來打開文件並將其內容作為String返回,然后在String上調用Execute Immediate

非常小心這樣做,因為這些文件中的任何惡意sql都可以做任何想做的事情。

即使應該有解決方案,我也不建議這樣做。 PL / SQL過程基本上是一個SQL腳本。 要么1.從數據庫外部運行SQL腳本,例如通過shell腳本,或者2.在過程中移動SQL代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM