как перебрать список идентификаторов и вставить запись в таблицу для каждого идентификатора в оракуле - PullRequest
0 голосов
/ 14 мая 2018

Привет, у меня есть список идентификаторов, скажем, 1,6,8,9,12,45,67, .... Я хочу перебрать эти идентификаторы и вставить запись в таблицу для каждого примера идентификатора -

for each id {
  insert into table_name(user_id, sys_id, crt_tsp) values (nextval,{this value is from above list}, current_timestamp)
}

как мне добиться этого в sql моя база данных oracle?

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Вот некоторый псевдокод для анонимного блока, который будет выполнять, как вы просите.Вам нужно создать временную таблицу с нужными идентификаторами.

declare
  cursor c0 is
    select 
    a.id_value,
    b.user_id,
    b.crt_tsp
    from temporary_table a
    join data_table b on b.id_value = a.id_value;

begin
for rec in c0 loop
  insert into table_name (...) values(rec.id_value, rec.user_id, rec.crt_tsp ...);
end loop;
end;
0 голосов
/ 14 мая 2018

Добавляя ответ @ MT0, в Oracle 12.2 и выше вам даже не нужна функция TABLE, вы можете напрямую выбирать из SYS.ODCINUMBERLIST или FROM NumberList(1, 6, 8, 9, 12, 45, 67)

INSERT INTO table_name (
    user_id
    ,sys_id
    ,crt_tsp
    )
SELECT sequence_name.NEXTVAL
    ,COLUMN_VALUE
    ,current_timestamp
FROM SYS.ODCINUMBERLIST(1, 6, 8, 9, 12, 45, 67);

Если вы можете передать список номеров через запятую, заключенный в строку , также можно использовать XMLTABLE (работает в 11g)

INSERT INTO table_name (
    user_id
    ,sys_id
    ,crt_tsp
    )
SELECT sequence_name.NEXTVAL
    ,to_number(COLUMN_VALUE)
    ,current_timestamp
FROM XMLTABLE('1, 6, 8, 9, 12, 45, 67');
0 голосов
/ 14 мая 2018

Вы можете использовать коллекцию. SYS.ODCINUMBERLIST является встроенным VARRAY, который вы можете использовать:

SQL Fiddle

Настройка схемы Oracle 11g R2 :

CREATE TABLE table_name(
  user_id NUMBER,
  sys_id  NUMBER,
  crt_tsp TIMESTAMP
);

CREATE SEQUENCE sequence_name;

INSERT INTO table_name( user_id, sys_id, crt_tsp) 
SELECT sequence_name.NEXTVAL,
       COLUMN_VALUE,
       current_timestamp
FROM   TABLE( SYS.ODCINUMBERLIST( 1,6,8,9,12,45,67 ) );

Запрос 1 :

SELECT * FROM table_name

Результаты :

| USER_ID | SYS_ID |                    CRT_TSP |
|---------|--------|----------------------------|
|       1 |      1 | 2018-05-14 14:14:08.157393 |
|       2 |      6 | 2018-05-14 14:14:08.157393 |
|       3 |      8 | 2018-05-14 14:14:08.157393 |
|       4 |      9 | 2018-05-14 14:14:08.157393 |
|       5 |     12 | 2018-05-14 14:14:08.157393 |
|       6 |     45 | 2018-05-14 14:14:08.157393 |
|       7 |     67 | 2018-05-14 14:14:08.157393 |

Или вы можете создать свой собственный тип:

CREATE TYPE NumberList IS TABLE OF NUMBER;

INSERT INTO table_name( user_id, sys_id, crt_tsp) 
SELECT sequence_name.NEXTVAL,
       COLUMN_VALUE,
       current_timestamp
FROM   TABLE( NumberList( 1,6,8,9,12,45,67 ) );

Обновление

Из комментария ОП к другому ответу:

Я хочу получить список номеров из другой таблицы

select id from table_name

Вы можете просто выбрать прямо из этой таблицы:

INSERT INTO table_name( user_id, sys_id, crt_tsp) 
SELECT sequence_name.NEXTVAL,
       id,
       current_timestamp
FROM   table_name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...