Oracle

如何從 Oracle SQL 腳本中分離出單個 sql 語句以從 java 程式碼中執行

  • August 9, 2016

我有 Oracle DB 11g 企業版,我想從我的 java 程式碼中執行 sql 腳本。我正在從 .sql 文件中讀取此 sql 腳本,該腳本包含諸如create tablecreate typealter tabledrop type、等語句drop procedureinsert into以及帶有beginandend和所有此類結構的 pl/sql 塊。

我的問題是,如何從java程式碼中分離出單獨的sql語句來執行?在 MS SQL 中,我可以簡單地按關鍵字分隔這些 sql 語句GO,而在 Oracle db 中沒有這樣的分隔符。那麼通常在 Oracle 數據庫腳本中用作分隔符的是什麼?


例如,我在我的 sql 腳本中創建了觸發器塊以及其他 sql 語句。這裡我有分號,我不能將其視為 SQL 語句終止憲章(PL/SQL 塊本身可以包含多個分號分隔的語句)。這意味著我不能使用;類似於GO(在 MS SQL 中)。

CREATE OR REPLACE TRIGGER SQLVersionHistory_SeqNum_TRG
  BEFORE INSERT 
  ON SQLVersionHistory
  FOR EACH ROW
  BEGIN
   :NEW.SequenceNumber := SQLVersionHistory_SeqNum.NEXTVAL;
  END;

是什麼創建了您的 sql 腳本文件?sql腳本文件創建可以修改嗎?

如果您可以修改 sql 腳本文件的創建,最簡單的方法是在語句之間將您自己的分隔符附加到您的腳本中。(評論應該是個好主意)

如果沒有,如果您只是在不可修改的源純文字文件中接收到一堆 sql 或 pl/sql 語句,那麼您應該編寫自己的解析算法。您必須記住,每個 sql 語句都以分號 (;) 結尾,由於 PL/SQL 塊可以包含多個 sql 語句,它們必須在新行中單獨以斜杠 (/) 結尾。

令人困惑的部分是,一些 SQL 語句實際上是儲存的 PL/SQL 塊,例如CREATE PROCEDURECREATE TRIGGER(文件書籍“Oracle® 數據庫 PL/SQL 語言參考”中的完整列表:http: //docs.oracle.com/cd/ E11882_01/appdev.112/e25519/sqlstatements.htm#LNPLS99979

(例如

  • ALTER, SELECT, DROP, GRANTetc.. 語句以分號結尾;
  • CREATE TABLESPACE, CREATE USER, CREATE TABLE, etc 語句以分號結尾;
  • CREATE PROCEDURE, CREATE PACKAGE, CREATE TRIGGER, etc 語句以斜杠結尾/
  • DECLARE, BEGIN(匿名 pl/sql 塊)語句以斜杠結尾/

)

問候

根據https://stackoverflow.com/questions/29961595/sql-server-go-equivalent-in-oracle,“;” 和“/”是 SQL Server 的 GO 的 Oracle 等價物。對於您的特定範例,由於這是一個可以包含“;”的塊,因此您需要用“/”關閉它。請注意,對於語句,添加尾隨“/”將重複該語句,因此以下內容:

commit;
/

…進行兩次送出。有關如何知道哪個是哪個,請參閱 vegatripy 的答案(+1)。

引用自:https://dba.stackexchange.com/questions/55294