Вставить строки (родительские и дочерние) программно - PullRequest
3 голосов
/ 05 февраля 2009

Я использую Spring и JDBCTemplate.

Сценарий - это таблица CUSTOMER и таблица ORDERS - отношение родитель-потомок.

Я хочу сделать вставку (например, 1 клиент и 5 заказов) - но я не уверен, как программно вставить строку в таблицу CUSTOMER (как получить уникальный генерируемый Oracle идентификатор), а затем вставить соответствующие 5 строк в дочерней таблице, ORDERS, с уникальным идентификатором, созданным вставкой клиента. Этот уникальный идентификатор, очевидно, поддерживает отношения между клиентом и его заказами.

Любая помощь высоко ценится.

PS - Код с примером SQL о том, как это делается в Spring Framework, был бы фантастическим - что-то довольно грубое, просто чтобы дать мне основную идею.

Ответы [ 4 ]

5 голосов
/ 05 февраля 2009

Проверьте метод update в JDBCTemplate, который принимает объект KeyHolder. После выполнения этот объект Keyholder содержит сгенерированный ключ.

В документации Spring есть пример использования здесь .

1 голос
/ 06 февраля 2009

Я ничего не знаю о JDBC или Spring, но Quassnoi дал вам один способ Oracle.

Но если ваш фреймворк не знает, как использовать предложение RETURNING ... вы можете использовать свойство currval последовательности.

SEQUENCE.Currval - это локальная «переменная» сеанса, которая содержит последнее значение, которое сеанс получил из последовательности.

BEGIN

  INSERT
    INTO customer (ID, name)
  VALUES (cust_seq.nextval, 'John Doe');

  INSERT
    INTO orders (customer, order)
  VALUES (cust_seq.currval, 'Order1');

  INSERT
    INTO orders (customer, order)
  VALUES (cust_seq.currval, 'Order2');

  INSERT
    INTO orders (customer, order)
  VALUES (cust_seq.currval, 'Order3');

END;
1 голос
/ 05 февраля 2009
DECLARE
  newid INTEGER;
BEGIN

  INSERT
    INTO customer (name)
  VALUES ('John Doe')
  RETURNING id
  INTO newid;

  INSERT
    INTO orders (customer, order)
  VALUES (newid, 'Order1');

  INSERT
    INTO orders (customer, order)
  VALUES (newid, 'Order2');

  INSERT
    INTO orders (customer, order)
  VALUES (newid, 'Order3');

END;
0 голосов
/ 20 февраля 2009

Другой способ - использовать последовательность для генерации идентификатора:

ВЫБЕРИТЕ seq.nextval FROM DUAL -> в переменную

Затем используйте этот номер в качестве уникального идентификатора, а не создавайте его автоматически для базы данных.

Аналогично приведенному выше предложению, за исключением того, что, если кто-то вставил другого клиента до того, как вы вставили все его заказы, вы получите эти заказы не у того клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...