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