Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Новый топик    Ответить
 INSERT, как одним предложением срздать несколько новых записей.  [new]
poiuytr
Member

Откуда:
Сообщений: 63
У меня есть 2 таблицы, они связаны так, что с одной строкой таблицы T1 ассоциируются несколько строк таблицы Т2. DB2 версии 8 на AIX.
CREATE TABLE T1
 (T1_ID      INTEGER  NOT NULL,
  T1_PARAM1  INTEGER  NOT NULL
 );
CREATE SEQUENCE t1_seq AS INTEGER START WITH 1 INCREMENT BY 1;
CREATE TABLE T2
 (T2_ID     INTEGER  NOT NULL  GENERATED BY DEFAULT
    AS IDENTITY (START WITH 1, INCREMENT BY 1, CACHE 20, MINVALUE 1, MAXVALUE 2147483647, NO CYCLE, NO ORDER),
  T1_ID     INTEGER  NOT NULL,
  T2_PARAM  INTEGER
 );

ALTER TABLE T1
  ADD CONSTRAINT SQL051026001353080 PRIMARY KEY
   (T1_ID
   );

ALTER TABLE T2
  ADD CONSTRAINT SQL051026001419220 PRIMARY KEY
   (T2_ID
   );

ALTER TABLE T2
  ADD CONSTRAINT SQL051026001419300 FOREIGN KEY
   (T1_ID
   )
    REFERENCES T1
     (T1_ID
     )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
    ENFORCED
    ENABLE QUERY OPTIMIZATION;
Таблицы после одного инсерта должны выглядеть примерно так:

t1_id | t1_param t2_id | t1_id | t2_param
------+--------- -------+---------+----------
1 | 5 1 | 1 | 4
2 | 1 | 5
3 | 1 | 6

Хочу оформить вставку в 2 таблицы в виде процедуры на SQL (в этом мне и нужна помощь). На входе процедуры будет значение t1_param и массив неопределённой длины t2_param. Что должно быть внутри процедуры? Я представляю как вставить процедурой одну запись, но как разобраться с массивом для второй таблицы? Вот что у меня уже есть:
CREATE PROCEDURE PROC_INSERT
 (OUT P_T1_ID INTEGER, 
  IN P_T1_PARAM INTEGER, 
  IN P_T2_PARAMS VARCHAR(1024)
 ) 
  SPECIFIC PROC_INSERT
  LANGUAGE SQL
  NOT DETERMINISTIC
  CALLED ON NULL INPUT
  MODIFIES SQL DATA
  INHERIT SPECIAL REGISTERS

  p1: begin

  VALUES NEXTVAL FOR t1_seq INTO p_t1_id;
  INSERT INTO t1 (t1_id, t1_param) VALUES (p_t1_id, p_t1_param);

  -- что делать далее я не знаю, предполагал, что P_T2_PARAMS
-- будет строка вида '4, 5, 6', чтобы внутри процедуры получить 
-- with tmp (t2_param) AS (values ' || p_t2_params || ' ) 
-- select * from tmp и как-то сделать инсерт в таблицу T2.

 end p1;
Подскажите как мне сделать инсерт в T2?
Спасибо.
26 окт 05, 01:51    [2005847]     Ответить | Цитировать Сообщить модератору
 Re: INSERT, как одним предложением срздать несколько новых записей.  [new]
poiuytr
Member

Откуда:
Сообщений: 63
Похоже я уже нашёл ответ
insert into t2 (t2_param, t1_id) 
with tmp (t2_param) AS (values 365, 366, 367) select tmp.*, 1 AS t1_id from tmp;
26 окт 05, 09:44    [2006232]     Ответить | Цитировать Сообщить модератору
 Re: INSERT, как одним предложением срздать несколько новых записей.  [new]
nkulikov
Guest
Можно вместо процедуры на оператор MERGE посмотреть...
26 окт 05, 10:28    [2006460]     Ответить | Цитировать Сообщить модератору
Все форумы / IBM DB2, WebSphere, IMS, U2, etc Ответить