Создайте триггер Oracle DB, используя тонкий драйвер JDBC
Вопрос
В настоящее время я настраиваю тестовую среду для приложения. Я использую Junit и Spring в своей тестовой среде. Перед тестовым выполнением я хочу настроить состояние среды тестирования базы данных. Я уже написал сценарии SQL (схема и данные), и они отлично работают в Oracles Sqldeveloper. Когда я пытался выполнить их, используя Thin Driver Oracle, выполнение сбоя. Похоже, что тонкий драйвер не любит создавать триггерные операторы.
Я читал, что я должен использовать драйвер OCI вместо тонкого драйвера. Проблема с драйвером OCI заключается в том, что она не зависит от платформы, и для его настроения требуется время.
Пример моего кода:
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;
Если я выполню оператор триггера, выполнение не удается, но я выгляжу так, что первая часть запроса (создать триггер »user_id_seq_Inc" ... "Пользователь" ... Начните ... из двойственного;) выполняется успешно, но Триггер, кажется, коррумпирован, если я стараюсь использовать его. Ошибка выключения выполнения поставляется со второй частью конца оператора; «ORA-00900: Неверный оператор SQL».
Кто-нибудь знает решение для этой проблемы? Я просто хочу создать триггер с неполнецентом Platform Thing JDBC драйвера.
Ваше здоровье!
Кевин
Решение
Спасибо, ребята, за ваши ответы, теперь все работает нормально. Причиной была синтаксическая ошибка или интерпретация моего файла кода SQL с Spring FrameFork. Когда я выполняю операторы непосредственно, используя метод выполнения JDBC, он работает, когда я использую функцию Spring для выполнения скрипта, выполнение не удается. С кодом Oracle SQL это кажется сложным, потому что, если я использую код HSQLDB SQL, он работает нормально.
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;
Это работает нормально! Важно удалить ;
В конце утверждений за исключением оператора триггера !!!
@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);
}
}
Другие советы
Создание триггеров работает с любым типом драйвера JDBC; должно быть что-то не так с синтаксисом SQL - что странно, потому что Oracle должен сообщить, что при запуске CREATE TRIGGER
(не когда вы используете его в первый раз).
С момента использования BEGIN ... END;
убедитесь, что у вас действительно есть ;
после END
В SQL, который вы отправляете в БД.
Если это не причина, Проверьте эту статью.
Я знаю, что это старый пост, но вот мой ответ.
По умолчанию инструкция Spring «Initializy-Database» разделить указанный скрипт с помощью точки с запятой: «;».
В триггере часто есть полуколон внутри триггера, поэтому запросы плохо разделены и выполнены.
Решение состоит в том, чтобы использовать еще один сплит -символ (например, «|», например:
<jdbc:initialize-database>
<jdbc:script location="classpath:myscript.sql" separator="|"/>
</jdbc:initialize-database>