我有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
引用是一个红鲱鱼,以及如何记录错误的人工制品.您尝试在一个中运行两个由分号分隔的SQL语句execute
.这是不允许的.分号是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;