【发布时间】:2014-01-03 15:26:20
【问题描述】:
我有 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: 无效字符\n 在 oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) 在 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331) 在 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288) 在 oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743) 在 oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:207) 在 oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:946) 在 oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1168) 在 oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1687) 在 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个字符?删除它们...
-
尝试使用转义字符表示 \\n 代替 \n
-
我尝试用单个空格替换
\n,也尝试用\\n代替\n,但仍然收到相同的错误消息。 -
那么请贴出那个sql-block的原始代码
标签: java sql oracle jdbc oracle11g