Создайте триггер Oracle DB, используя тонкий драйвер JDBC

StackOverflow https://stackoverflow.com/questions/4107028

Вопрос

В настоящее время я настраиваю тестовую среду для приложения. Я использую 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top