[英]ORA-06550 line 2, column 44:PLS-00103: Encountered the symbol "end-of-file"
我正在嘗試使用一些 rxjava2 方法從 Java 執行 SQL 腳本。 我有一個名為init_db.sql
的資源文件。
其內容:
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE animals';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
/
CREATE TABLE animals (
id NUMBER GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1),
name VARCHAR2(40) NOT NULL,
amount INT,
CONSTRAINT animals_pk PRIMARY KEY (id));
INSERT INTO animals (name, amount) values ('Cats', 10);
INSERT INTO animals (name, amount) values ('Dogs', 10);
INSERT INTO animals (name, amount) values ('Rats', 10);
執行 Java 代碼的方法是下一個:
public Completable initOracleDatabase(Vertx vertx, JDBCClient jdbc) {
System.out.println("Init Oracle Database **** executing..sql script...");
Completable completable =
jdbc.rxGetConnection().flatMapCompletable(sqlConnection -> vertx.fileSystem().rxReadFile("init_db.sql")
.flatMapObservable(buffer -> Observable.fromArray(buffer.toString().replaceAll(";.*$", "").split(";")))
.flatMapCompletable(sqlConnection::rxExecute)
.doAfterTerminate(sqlConnection::close));
return completable;
這是我從日志中得到的錯誤:
java.sql.SQLException: ORA-06550: line 2, column 44:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
* & = - + ; < / > at in is mod remainder not rem return
returning <an exponent (**)> <> or != or ~= >= <= <> and or
like like2 like4 likec between into using || multiset bulk
member submultiset
和錯誤跟蹤日志:
at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:509)
at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:461)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1104)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:553)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:269)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:655)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:229)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:41)
at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:928)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1205)
at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1823)
at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1778)
at oracle.jdbc.driver.OracleStatementWrapper.execute(OracleStatementWrapper.java:303)
基本上我想知道我是否可以在一個唯一的聲明中使用這個 SQL 腳本程序? 或者如果我遺漏了任何東西或在 SQL 腳本和 Java 之間轉換的錯誤代碼?
您在同一腳本中混合使用 PL/SQL 和 SQL 代碼。
;
終止 ./
終止,並將包含嵌套的 PL/SQL(或 SQL)語句,每個語句以;
終止。 . 所以你不能天真地拆分你的代碼;
並期望它能正常工作,因為您會錯誤地拆分 PL/SQL 塊。
除了使用;
作為 SQL 語句終止符,您還可以在換行符上使用/
; 所以你可以將你的腳本重寫為:
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE animals';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
/
CREATE TABLE animals (
id NUMBER GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1),
name VARCHAR2(40) NOT NULL,
amount INT,
CONSTRAINT animals_pk PRIMARY KEY (id)
)
/
INSERT INTO animals (name, amount) values ('Cats', 10)
/
INSERT INTO animals (name, amount) values ('Dogs', 10)
/
INSERT INTO animals (name, amount) values ('Rats', 10)
/
並在\n/\n
上拆分腳本。
或者,您可以忽略捕獲 ORA-00942 異常並僅使用 SQL 並繼續使用;
語句終止符:
DROP TABLE animals;
CREATE TABLE animals (
id NUMBER GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1),
name VARCHAR2(40) NOT NULL,
amount INT,
CONSTRAINT animals_pk PRIMARY KEY (id)
);
INSERT INTO animals (name, amount) values ('Cats', 10);
INSERT INTO animals (name, amount) values ('Dogs', 10);
INSERT INTO animals (name, amount) values ('Rats', 10);
或者,您可以創建一個更復雜的解決方案,它實際解析 PL/SQL 和 SQL 語句,並可以根據語法樹將腳本拆分為單獨的語句。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.