Question

actuellement, je la mise en place d'un environnement de test pour une application. Je JUnit et le printemps dans mon environnement de test. Avant l'exécution d'un test que je veux mettre en place un environnement de test de base de données État. I a déjà écrit les scripts SQL (schéma et données) et ils fonctionne très bien dans Oracles sqldeveloper. Comme je l'ai essayé de les exécuter en utilisant l'oracle mince pilote jdbc, l'exécution échoue. Il ressemble à ce que le conducteur mince n'aime pas créer des instructions de déclenchement.

Je lis que je dois utiliser un pilote oci au lieu de mince conducteur. Le problème avec le pilote oci est qu'il ne soit pas indépendante de la plate-forme et il faut du temps pour le mettre en place.

Exemple de mon code:

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 j'exécute le compte de déclencher l'exécution échoue, mais je ressemble à ce que la première partie de la requête (CREATE TRIGGER « USER_ID_SEQ_INC » ... « USER » ... BEGIN ... FROM DUAL;) est exécutée avec succès, mais le déclencheur semble être corrompu si je tente de l'utiliser. L'erreur d'exécution est l'échec de la deuxième partie de l'instruction END; "ORA-00900: instruction SQL non valide".

Ne quelqu'un sait une solution à ce problème? Je veux juste créer un déclencheur avec la plate-forme pilote indépendant jdbc mince.

Vive!

Kevin

Était-ce utile?

La solution

Merci les gars pour vos réponses, il fonctionne bien maintenant. La raison était une erreur de syntaxe ou l'interprétation de mon fichier de code SQL avec Spring Framefork. Quand j'exécutez les instructions directement à l'aide de la méthode d'exécution jdbc cela fonctionne, quand j'utilise la fonctionnalité de printemps pour l'exécution du script l'exécution échoue. Avec le code sql oracle, il semble être difficile, parce que si j'utilise le code hsqldb sql il fonctionne très 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;

Cela fonctionne bien! Il est important de retirer ; à la fin des déclarations de l'instruction excepte déclencheur !!!

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

Autres conseils

Création de triggers fonctionne avec tout type de pilote JDBC; il doit y avoir quelque chose de mal avec la syntaxe SQL - ce qui est étrange, car Oracle devrait signaler que lorsque vous exécutez le CREATE TRIGGER (pas lorsque vous utilisez la première fois)

.

Puisque vous utilisez make BEGIN ... END;-vous que vous avez vraiment un ; après END dans le SQL que vous envoyez à la DB.

Si ce n'est pas la cause, consulter cet article .

Je sais que c'est un ancien poste, mais voici ma réponse.

Par défaut, Spring instruction "initialize-base de données" diviser le script spécifié en utilisant le point-virgule: ";"

.

Dans un déclencheur, il y a souvent un point-virgule dans la détente, donc les requêtes sont mal exécutées fente et.

La solution consiste à utiliser un autre caractère split ( "|", par exemple) comme ceci:

<jdbc:initialize-database>
    <jdbc:script location="classpath:myscript.sql" separator="|"/>
</jdbc:initialize-database>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top