Pregunta

Actualmente la creación de un entorno de prueba para una aplicación. Estoy usando jUnit y la primavera en mi entorno de prueba. Antes de una ejecución de pruebas Quiero configurar un entorno de prueba de estado de base de datos. Ya ha escrito los scripts SQL (esquema y datos) y que funciona muy bien en los oráculos SQLDeveloper. Mientras trataba de ejecutarlos mediante el controlador JDBC de Oracle delgada, la ejecución falla. Se ve como que el controlador fino no le gusta crear instrucciones de activación.

He leído que tengo que utilizar un controlador OCI en lugar de controlador fino. El problema con el controlador OCI es que no es independiente de la plataforma y se necesita tiempo para configurarlo.

Ejemplo de mi código:

CREATE TABLE "USER"
  (
    USER_ID          NUMBER(10) NOT NULL,
    CREATOR_USER_FK  NUMBER(10) NOT NULL,
    ...
    PRIMARY KEY (USER_ID)
  );
CREATE SEQUENCE SEQ_USER START WITH 1 INCREMENT BY 1;
CREATE TRIGGER "USER_ID_SEQ_INC" BEFORE
  INSERT ON "USER" FOR EACH ROW BEGIN
  SELECT SEQ_USER.nextval
  INTO :new.USER_ID
  FROM DUAL;
END;

Si ejecuto la declaración del gatillo falla la ejecución, pero me parece que que la primera parte de la consulta, se ejecuta (CREATE TRIGGER "USER_ID_SEQ_INC" ... "USUARIO" ... BEGIN ... FROM DUAL) con éxito, pero el gatillo parece estar dañado si trato de usarlo. El error de ejecución fallar viene con la segunda parte de la declaración END; "ORA-00900: instrucción SQL no válida".

Do Alguien sabe una solución para ese problema? Sólo quiero crear un disparador con la plataforma de controlador JDBC delgada independiente.

Saludos!

Kevin

¿Fue útil?

Solución

Gracias a todos por sus respuestas, Funciona bien ahora. La razón fue un error de sintaxis o la interpretación de mi archivo de código SQL con la primavera Framefork. Cuando yo haga las declaraciones directamente usando el método de ejecución de JDBC funciona, cuando se utiliza la funcionalidad de primavera para la ejecución del script la ejecución falla. Con el código SQL de Oracle parece ser complicado, porque si uso el código SQL hsqldb que trabaja muy bien.

test-condext.xml:

...
<jdbc:initialize-database data-source="dataSource"
    ignore-failures="DROPS" enabled="${jdbc.enableSqlScripts}">
    <jdbc:script location="${jdbc.initLocation}" />
    <jdbc:script location="${jdbc.dataLocation}" />
</jdbc:initialize-database>
...

schema.sql:

DROP SEQUENCE SEQ_USER;
DROP TABLE "USER" CASCADE CONSTRAINTS;
PURGE TABLE "USER";
CREATE TABLE "USER"
  (
    USER_ID          NUMBER(10) NOT NULL,
    CREATOR_USER_FK  NUMBER(10) NOT NULL,
    PRIMARY KEY (USER_ID)
  );
ALTER TABLE "USER" ADD CONSTRAINT FK_USER_CUSER FOREIGN KEY (CREATOR_USER_FK) REFERENCES "USER" (USER_ID);
CREATE SEQUENCE SEQ_USER START WITH 1 INCREMENT BY 1;
CREATE TRIGGER "USER_ID_SEQ_INC" BEFORE
  INSERT ON "USER" FOR EACH ROW
  WHEN (new.USER_ID IS NULL)
BEGIN
  SELECT SEQ_USER.nextval
  INTO :new.USER_ID
  FROM DUAL;
END;
/
ALTER TRIGGER "USER_ID_SEQ_INC" ENABLE;

Esta bien funciona! Su importante eliminar ; al final de declaraciones exceptúa la declaración de disparo !!!

@Before
public void executeSomeSql() {
    Connection c;
    try {
        c = dataSource.getConnection();
        c.createStatement()
                .execute("CREATE TABLE \"USER\" (USER_ID NUMBER(10) NOT NULL, CREATOR_USER_FK NUMBER(10) NOT NULL, PRIMARY KEY (USER_ID))");
        c.createStatement()
                .execute("CREATE SEQUENCE SEQ_USER START WITH 1 INCREMENT BY 1");
        c.createStatement()
                .execute("CREATE OR REPLACE TRIGGER \"USER_ID_SEQ_INC\" BEFORE INSERT ON \"USER\" FOR EACH ROW WHEN (new.USER_ID IS NULL) BEGIN SELECT SEQ_USER.nextval INTO :new.USER_ID FROM DUAL; END;");
    } catch (SQLException e) {
        logger.debug(e);
    }
}

Otros consejos

Creación de disparadores funciona con cualquier tipo de controlador JDBC; debe haber algo mal con la sintaxis SQL - lo cual es extraño ya que Oracle debe informar que al ejecutar el CREATE TRIGGER (no cuando se utiliza por primera vez)

.

Desde que utilizar BEGIN ... END; asegurarse de que usted realmente tiene un ; después END en el SQL que se envía a la base de datos.

Si eso no es la causa, comprobar este artículo .

Sé que esto es un post viejo, pero aquí está mi respuesta.

Por defecto, la primavera "initialize base de datos" instrucción divide el guión indicado mediante el carácter de punto y coma: ";"

.

En un disparador, hay a menudo es un punto y coma en el interior del gatillo, así las consultas están mal estar sobre y ejecutados.

La solución es utilizar otro personaje dividido ( "|", por ejemplo) como esto:

<jdbc:initialize-database>
    <jdbc:script location="classpath:myscript.sql" separator="|"/>
</jdbc:initialize-database>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top