Domanda

Al momento ho la creazione di un ambiente di test per un'applicazione. Sto usando JUnit e la primavera nel mio ambiente di test. Prima di un'esecuzione del test voglio istituire uno stato ambiente di test del database. Ho già ha scritto gli script SQL (schema e dati) e funziona bene in Oracoli SQLDeveloper. Come ho cercato di eseguirli utilizzando il driver jdbc sottile oracolo, l'esecuzione fallisce. Sembra che il driver sottile non piace creare istruzioni di trigger.

Ho letto che devo usare un driver oci al posto di conducente sottile. Il problema con il driver OCI è che non è indipendente dalla piattaforma e ci vuole tempo per configurarlo.

Esempio del mio codice:

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;

Se eseguo la dichiarazione il grilletto l'esecuzione non riesce, ma mi sembra che che la prima parte della query, viene eseguita (CREATE TRIGGER "USER_ID_SEQ_INC" ... "USER" ... BEGIN ... FROM DUAL) con successo, ma il grilletto sembra essere danneggiato se provo ad usarlo. L'errore di esecuzione non riuscire viene fornito con la seconda parte della END economico; "ORA-00900: istruzione SQL non valido".

Do qualcuno sa una soluzione per questo problema? Voglio solo creare un trigger con la piattaforma driver JDBC sottile indipendente.

Cheers!

Kevin

È stato utile?

Soluzione

Grazie ragazzi per le vostre risposte, funziona benissimo ora. Il motivo è stato un errore di sintassi o l'interpretazione del mio file di codice SQL con la Primavera Framefork. Quando eseguo le dichiarazioni direttamente utilizzando il metodo execute di JDBC funziona, quando uso la funzionalità di primavera per l'esecuzione di script l'esecuzione non riesce. Con Oracle codice SQL sembra essere difficile, perché se io uso il codice SQL hsqldb funziona benissimo.

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;

Questo funziona bene! La sua importante rimuovere ; alla fine del bilancio excepts dichiarazione grilletto !!!

@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);
    }
}

Altri suggerimenti

La creazione di trigger funziona con qualsiasi tipo di driver JDBC; ci deve essere qualcosa di sbagliato con la sintassi SQL - che è strano perché Oracle deve segnalare che quando si esegue il CREATE TRIGGER (non quando lo si utilizza per la prima volta)

.

Dal momento che utilizzare BEGIN ... END; assicurarsi di avere davvero un ; dopo END in SQL, che si invia al DB.

Se questo non è la causa, controllare questo articolo .

So che questo è un vecchio post, ma ecco la mia risposta.

Per impostazione predefinita, Primavera "di inizializzazione-database" istruzione di dividere lo script specificato utilizzando il carattere virgola: ";"

.

In un trigger, v'è spesso un punto e virgola all'interno del grilletto, in tal modo le query sono mal spacco e giustiziati.

La soluzione è quella di utilizzare un altro personaggio split ( "|", per esempio) in questo modo:

<jdbc:initialize-database>
    <jdbc:script location="classpath:myscript.sql" separator="|"/>
</jdbc:initialize-database>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top