如何從 Oracle SQL 腳本中分離出單個 sql 語句以從 java 程式碼中執行
我有 Oracle DB 11g 企業版,我想從我的 java 程式碼中執行 sql 腳本。我正在從 .sql 文件中讀取此 sql 腳本,該腳本包含諸如
create table
、create type
、alter table
、drop type
、等語句drop procedure
,insert into
以及帶有begin
andend
和所有此類結構的 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 PROCEDURE
或CREATE TRIGGER
(文件書籍“Oracle® 數據庫 PL/SQL 語言參考”中的完整列表:http: //docs.oracle.com/cd/ E11882_01/appdev.112/e25519/sqlstatements.htm#LNPLS99979)(例如
ALTER
,SELECT
,DROP
,GRANT
etc.. 語句以分號結尾;
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)。