Thank you guys for your answers. Now it works great. The reason was a syntax error or interpretation of my SQL code using Spring Framefork. When I execute the instructions directly using the execute jdbc method, it works, when I use Spring to execute the execution script, the execution fails. With oracle sql code this seems complicated because if i use hsqldb sql code it works fine.
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;
It's fine! It is important to remove it ; at the end of statements, except for the trigger instruction !!!
@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); } }
source share