Frage

zur Zeit einstellen ich eine Testumgebung für eine Anwendung auf. Ich verwende jUnit und Frühling in meiner Testumgebung. Vor einer Testausführung möchte ich eine Datenbank Testumgebung Zustand einzurichten. Ich wurde bereits die SQL-Skripte (Schema und Daten) geschrieben und sie läuft gut in Oracles sqldeveloper. Als ich versuchte, sie auszuführen, indem das Orakel Thin JDBC-Treiber verwenden, schlägt die Ausführung. Es sieht so aus, dass die Thin-Treiber nicht wie Trigger-Anweisungen erstellen.

Ich habe gelesen, dass ich eine OCI-Treiber verwenden anstelle von Thin-Treiber. Das Problem mit dem OCI-Treiber ist, dass es nicht plattformunabhängig ist und es braucht Zeit, um es einzurichten.

Beispiel meines Codes:

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;

Wenn ich ausführen, die die Trigger-Anweisung die Ausführung fehlschlägt, aber ich aussehen, dass der erste Teil der Abfrage (CREATE TRIGGER „USER_ID_SEQ_INC“ ... „USER“ ... BEGIN ... FROM DUAL;) ausgeführt wird, erfolgreich, aber scheint der Auslöser korrupt zu sein, wenn ich versuche, es zu benutzen. Die Ausführung scheitern Fehler kommt mit dem zweiten Teil der Anweisung END; "ORA-00900: ungültige SQL-Anweisung".

Do jemand eine Lösung für dieses Problem wissen? Ich möchte nur einen Trigger mit plattformunabhängigen Thin JDBC-Treiber erstellen.

Cheers!

Kevin

War es hilfreich?

Lösung

Danke Jungs für Ihre Antworten, es funktioniert jetzt. Der Grund dafür war ein Syntaxfehler oder die Interpretation meiner SQL-Code-Datei mit Feder Framefork. Wenn ich die Anweisungen ausführen direkt durch das Ausführen mit der Methode von jdbc es funktioniert, wenn ich die Frühlings-Funktionalität für Skriptausführung verwenden schlägt die Ausführung. Mit Oracle SQL-Code scheint es schwierig zu sein, denn wenn ich hsqldb SQL-Code verwenden, es funktioniert gut.

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;

Das funktioniert gut! Es ist wichtig, ; am Ende Aussagen excepts die Trigger-Anweisung zu entfernen !!!

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

Andere Tipps

Trigger Erstellen arbeitet mit jeder Art von JDBC-Treiber; es muss etwas falsch mit der SQL-Syntax sein - die wegen Oracle sollte ungerade berichten, dass beim Ausführen des CREATE TRIGGER (nicht, wenn Sie es das erste Mal verwenden)

.

Da Sie BEGIN ... END; make verwenden Sie sicher, dass Sie wirklich eine ; nach END in der SQL, die Sie an die DB zu senden.

Wenn das nicht die Ursache, diesen Artikel überprüfen.

Ich weiß, das ist eine alte Post, aber hier ist meine Antwort.

In der Standardeinstellung Spring „initialize-Datenbank“ Anweisung spaltete die angegebene Skript durch die Semikolon-Zeichen verwenden: „;“

.

In einem Trigger, gibt es oft ein Semikolon innerhalb des Trigger, so werden die Abfragen schlecht gespaltet und ausgeführt wird.

Die Lösung ist ein weiteres Spalt Zeichen zu verwenden ( „|“ zum Beispiel) wie folgt aus:

<jdbc:initialize-database>
    <jdbc:script location="classpath:myscript.sql" separator="|"/>
</jdbc:initialize-database>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top