换行符\ n给出“java.sql.SQLException:ORA-00911:无效字符\ n”Oracle 11g
我有Oracle DB 11g企业版,我想通过从文件中读取sql脚本来创建表。 Java代码我读下面从文件sql脚本并将其存储在一个String sqlBlock
:换行符 n给出“java.sql.SQLException:ORA-00911:无效字符 n”Oracle 11g
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.T4CTTIoer.processError(T4CTTIoer.java))。 :288)at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:207)at oracle.jdbc.driver.T4CStatement.executeForRows (T4CStatement.java:946) 在 oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1168) 在 oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1687) 在 预言。 jdbc.driver.OracleStatement.execute(OracleStateme nt.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
上没有尾随分号;因为它在结束触发器的PL/SQL块时仍需要它,因此它不会作为语句分隔符 - 我感到困惑,我知道),并分别阅读和执行它们。然后每个execute
有一个单一的声明,并会更快乐。
另外,你不需要在11g中选择你的序列值到你的变量中; you can now do it like this:
CREATE OR REPLACE TRIGGER VerHist_SeqNum_TRG
BEFORE INSERT
ON VerHist
FOR EACH ROW
BEGIN
:NEW.SequenceNumber := VerHist_SeqNum.NEXTVAL;
END;
为什么你有\ n字符?删除它们... –
尝试使用转义字符意味着\\ n代替\ n –
我尝试用单个空格替换'\ n',也试过'\\ n'而不是'\ n',但仍然得到相同的错误信息。 – Learner