![](/img/trans.png)
[英]Insertion error : java.sql.SQLException: ORA-00911: invalid character
[英]newline charter \n gives “java.sql.SQLException: ORA-00911: invalid character\n” Oracle 11g
我有Oracle DB 11g企業版,我想通過從文件中讀取sql腳本來創建表。通過java代碼我正在從文件中讀取sql腳本並將其存儲在String sqlBlock
:
CREATE SEQUENCE VerHist_SeqNum
START WITH 1
INCREMENT BY 1;
CREATE TABLE VerHist
(
SequenceNumber NUMBER(10,0) NOT NULL,
SQLFileName VARCHAR2(100) NOT NULL,
STATUS VARCHAR2(10) NOT NULL,
AppliedDate DATE NOT NULL,
DateCreated DATE
DEFAULT (SYSDATE),
DateUpdated DATE
DEFAULT (SYSDATE),
CONSTRAINT PK_VerHist PRIMARY KEY( SequenceNumber ),
CONSTRAINT UC_VerHist_SQLFileNa UNIQUE( SQLFileName )
);
CREATE OR REPLACE TRIGGER VerHist_SeqNum_TRG
BEFORE INSERT
ON VerHist
FOR EACH ROW
BEGIN
SELECT VerHist_SeqNum.NEXTVAL INTO :NEW.SequenceNumber
FROM DUAL;
END;
當我執行此查詢時,它給出了
java.sql.SQLException:ORA-00911:在Oracle的oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)的oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)中出現無效字符\\ n .jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:207)at at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:946)at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1168)at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1687) at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1653)
以下是我執行sql塊的代碼:
Statement stmt = conn.createStatement();
String sqlBlock = //"this contains the content of the file (it contains \n charters)";
stmt.execute(sqlBlock);
這里的換行章程是否無效,如果是的話,如何讓這個工作起作用呢?
請注意,當我復制粘貼此文件的內容並通過Oracle SQL Developer運行腳本時,它運行正常。
我認為\\n
引用是一個紅色的鯡魚,以及如何記錄錯誤的人工制品。 您試圖在一次execute
運行兩個由分號分隔的SQL語句。 這是不允許的。 分號是SQL * Plus中的語句分隔符,而不是SQL,並且即使使用單個語句也會生成ORA-00911。 而execute
必須是一個單一的聲明。
如果您正在使用DML,您可以將語句包裝在PL / SQL塊中並執行它,但由於這是DDL,因此除非您使用動態SQL,否則無法執行此操作,這對於您來說過於復雜和混亂正在努力做。
您需要將每個語句放在一個單獨的文件中( create sequence
上沒有尾部分號;您仍然需要在create trigger
因為它結束了觸發器的PL / SQL塊,而不是作為語句分隔符 - 令人困惑,我知道),並分別閱讀和執行它們。 然后每個execute
都有一個語句,並且會更快樂。
另外,您不需要在11g的變量中選擇序列值; 你現在可以這樣做 :
CREATE OR REPLACE TRIGGER VerHist_SeqNum_TRG
BEFORE INSERT
ON VerHist
FOR EACH ROW
BEGIN
:NEW.SequenceNumber := VerHist_SeqNum.NEXTVAL;
END;
當您將文件的包含粘貼到瀏覽器時。 瀏覽器將\\ n視為新行。 而代碼/ n只是字符。 嘗試用單個空格替換\\ n然后運行它將起作用
sqlBlock = sqlBlock.replaceAll("\\n"," ");
從查詢中刪除\\ n。 如果要在sql developer中格式化查詢,可以選擇查詢並按Ctrl + F7
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.