ojdbc8 ojdbc7 gratis descargar 11g java sql oracle jdbc oracle11g

java - ojdbc7 - oracle jdbc maven



la nueva línea charter / n da "java.sql.SQLException: ORA-00911: carácter no válido / n" Oracle 11g (3)

Tengo Oracle DB 11g Enterprise Edition y quiero crear una tabla leyendo el script sql desde un archivo. A través del código java, estoy leyendo el script sql desde un archivo y lo estoy almacenando en un 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;

Cuando ejecuto esta consulta, da

java.sql.SQLException: ORA-00911: carácter no válido / n en oracle.jdbc.driver.DatabaseError.throwSqlException (DatabaseError.java:112) en oracle.jdbc.driver.T4CTTIoer.processError (T4CTTIoer.java:331) en oráculo .jdbc.driver.T4CTTIoer.processError (T4CTTIoer.java:288) en oracle.jdbc.driver.T4C8Oall.receive (T4C8Oall.java:743) en oracle.jdbc.driver.T4CStatement.doOall8 (T4CStatement.java:207) en oracle.jdbc.driver.T4CStatement.executeForRows (T4CStatement.java:946) en oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout (OracleStatement.java:1168) en oracle.jdbc.driver.OracleStatement.executeInternal (OracleStatement.java:1687) en oracle.jdbc.driver.OracleStatement.execute (OracleStatement.java:1653)

A continuación está mi código para ejecutar el bloque sql:

Statement stmt = conn.createStatement(); String sqlBlock = //"this contains the content of the file (it contains /n charters)"; stmt.execute(sqlBlock);

¿Es la carta de nueva línea inválida aquí, si es así, cómo hacer que esto funcione de otra manera?

Tenga en cuenta que cuando copie, pegue los contenidos de este archivo y ejecute el script a través de Oracle SQL Developer .


Creo que la /n es un destello, y un artefacto de cómo se registra el error. Está intentando ejecutar dos instrucciones SQL, separadas por un punto y coma, en una execute . Eso no está permitido. El punto y coma es un separador de instrucciones en SQL * Plus, no en SQL, y generará un ORA-00911 incluso con una sola instrucción. Y execute tiene que ser una sola declaración.

Si estuvieras haciendo DML, podrías envolver las declaraciones en un bloque PL / SQL y ejecutar eso, pero como esto es DDL no puedes hacer eso a menos que recurras a SQL dinámico, que será demasiado complicado y desordenado para lo que Estoy tratando de hacer.

Debe colocar cada instrucción en un archivo separado (sin el punto y coma posterior en la create sequence , todavía lo necesita en el create trigger porque allí está terminando el bloque PL / SQL del desencadenante, no actúa como un separador de declaración - confuso , Lo sé), y leer y ejecutarlos por separado. Entonces cada execute tiene una sola declaración, y será mucho más feliz.

Como un aparte, no necesita seleccionar el valor de secuencia en su variable en 11g; ahora puedes hacerlo así :

CREATE OR REPLACE TRIGGER VerHist_SeqNum_TRG BEFORE INSERT ON VerHist FOR EACH ROW BEGIN :NEW.SequenceNumber := VerHist_SeqNum.NEXTVAL; END;


Cuando copie, pegue el contenido del archivo en el navegador. El navegador tratará / n como una nueva línea. Mientras que para el código / n es solo el carácter. Intenta reemplazar / n con un espacio simple y luego ejecutarlo funcionará


sqlBlock = sqlBlock.replaceAll("/n"," ");

Elimina / n de la consulta. Si desea que la consulta se formatee en el desarrollador sql, puede seleccionar la consulta y presionar Ctrl + F7