簡體   English   中英

換行章程\\ n給出“java.sql.SQLException:ORA-00911:無效字符\\ n”Oracle 11g

[英]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.

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