2017-01-23 6 views
0

Я использую Oracle DB V10.2.0.1.0 для своего проекта вместе с Java как сервером. Я пытаюсь добавить данные в несколько таблиц только через код, но для этого требуется использовать одно и то же значение последовательности.JDBC - Get Sequence CURRVAL после использования NEXTVAL с помощью триггера

У меня есть последовательность, которая представляет идентификатор стола T_GROUP с именем GROUP_SEQ. (Increment by: 1, Min_Value: 1, Max_Value: 999999999999999999999999, Размер кеша: 20, Цикл: Нет, Заказ: Нет).

Said GROUP_SEQ увеличивается на спусковой крючок, когда я ввести новую группу в базу данных:

CREATE OR REPLACE TRIGGER GROUP_TRIGGER2 
BEFORE INSERT ON T_GROUP for each row 
begin 
SELECT GROUP_SEQ.nextval 
INTO :new.ID 
from dual; 
END; 

В моем коде, я выполнил addGroup() функции в своем коде, который успешно добавляет новую группу вместе с правая GROUP_SEQ значение, однако, когда я пытаюсь получить currval он терпит неудачу, потому что я не использовал NEXTVAL по себе, и я получаю это исключение:

ORA-08002: sequence GROUP_SEQ.currval is not yet defined in this session 

Хотя я и определил его в триггере. Случается так же, если я запускаю те же команды с помощью SQLplus cmd.

Заранее благодарен!

+0

Ты не ослушался Первой заповеди Оракула, которая: «Ты определишь свою схему, или страдаешь вечным проклятием, а на твоей голове падут змеи, лягушки и водолазы Другие рептилии и амфибии - да, даже на твоей голове ОСТАЕТСЯ ТОКАМИ ". Совпадение? Я думаю * НЕ !!!! * :-) –

+0

Вы используете пул соединений в java-сервере? – krokodilko

+0

@krokodilko Я не уверен - я использую aa singleton, чтобы получить одно соединение через 'DriverManager.getConnection()' функцию 'java.sql.DriverManager' после регистрации моего драйвера. Я полагаю, что он использует пул соединений в фоновом режиме, но я не создал пул собственного –

ответ

0

Решено!

Проблема была действительно в связи с тем, что я использовал - было место, где я снова использовал getConnection и, следовательно, имел другой сеанс.

Благодаря @krokodilko

0

Если у вас есть данные для вставки в несколько таблиц, то написать хранимую процедуру, чтобы сделать DML для всех таблиц на одном дыхании:

CREATE OR REPLACE PROCEDURE add_group(
    in_column_a IN T_GROUP.COLUMN_A%TYPE, 
    in_column_b IN T_GROUP.COLUMN_B%TYPE, 
    out_id  OUT T_GROUP.ID%TYPE 
) 
AS 
BEGIN 
    INSERT INTO T_GROUP (
    id, 
    column_a, 
    column_b 
) VALUES (
    GROUP_SEQ.NEXTVAL, 
    in_column_a, 
    in_column_b 
) 
    RETURNING id INTO out_id; 

    INSERT INTO other_table (
    id 
) VALUES (
    out_id 
); 
END; 
/

Почти во всех случаях, вам не нужно использовать триггеры.