Выполнение запроса несколько раз с другим параметром - PullRequest
0 голосов
/ 28 марта 2019

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

У меня есть две таблицы, как показано ниже:

Таблица профиля:

ID  NAME    VALUE
1   AAA 111
2   BBB 222
3   CCC 333
4   DDD 444 ```

Таблица атрибутов:

ID  ATTRIBUTE_ID    VALUE
1       1            VAL1
2       1            VAL2
3       2            VAL2
4       2            VAL3

Теперь я хочу взять каждый уникальный идентификатор из таблицы профиля и вставить соответствующую строку в таблицу атрибутов с новым значением. Конечная таблица должна выглядеть следующим образом:

ID  ATTRIBUTE_ID    VALUE
1       1            VAL1
2       1            VAL2
3       2            VAL2
4       2            VAL3
5       1            VAL4
6       2            VAL4

Я попробовал следующий курсор и не смог:

DECLARE
-- Store the SELECT query in a cursor
  CURSOR l_cur IS SELECT DISTINCT(ID) FROM PROFILE table;  
--Create a variable that will hold each result from the cursor
l_cur_rec l_cur%ROWTYPE;

BEGIN
-- Open the Cursor so that we may retrieve results
  OPEN l_cur;  
  LOOP
-- INSERT INTO another table
        INSERT INTO ATTRIBUTE table (ID, ATTRIBUTE_ID, PLATFORM_ID) 
        VALUES((select max(ID)+1 from ATTRIBUTE_PLATFORM), (l_cur) , VAL4);  
-- EXIT the loop if there are no more results
    EXIT WHEN l_cur%NOTFOUND;     
  END LOOP;
-- Close the cursor to release the memory
  CLOSE l_cur;
END;

1 Ответ

0 голосов
/ 28 марта 2019

Вы должны использовать последовательность и триггер, чтобы заполнить id в таблице атрибутов, или в Oracle 12 вы можете использовать автоматически генерируемый столбец. select max(id)+1 не очень хорошая идея в реальных таблицах из-за параллельных сеансов. Тогда вы можете сделать вставку в одном утверждении:

insert into attribute_table (attribute_id, value) 
  select distinct id, 'VAL4' from profile_table

Если вы хотите остаться в своем решении, исправьте свой код, как здесь:

declare
  cursor l_cur is select distinct(id) from profile_table;  
  l_cur_rec l_cur%rowtype;
begin
  open l_cur;  
  loop
    fetch l_cur into l_cur_rec;
    exit when l_cur%notfound;     
    dbms_output.put_line(l_cur_rec.id);
    insert into attribute_table (id, attribute_id, value) 
      values((select max(id)+1 from attribute_table), l_cur_rec.id, 'VAL4');  
  end loop;
  close l_cur;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...