Как сохранить данные из оператора SELECT и использовать эти данные для цикла с оператором UPDATE - PullRequest
0 голосов
/ 25 мая 2018

Я использую PLSQL, и я хочу сохранить результаты запроса из инструкции SELECT в массиве, а затем я хочу выполнить цикл, используя элементы из этого массива, чтобы ОБНОВИТЬ все строки.Проблема с кодом ниже состоит в том, что он возвращает одну строку.Подзапрос возвращает более одной строки, потому что он пытается установить более одной переменной в строке.Можете ли вы помочь мне в этой ситуации?

Это мой код:

CREATE OR REPLACE PROCEDURE looping IS
BEGIN
    FOR rec IN (SELECT IID FROM DATMCCN0)
    LOOP
        UPDATE DATMCCN0
        SET E_NOME = (SELECT I_NOME FROM DAT_CCNCONFIG0 INNER JOIN DATMCCN0 ON DAT_CCNCONFIG0.I_NOME = DATMCCN0.CAPLIC where DATMCCN0.IID = rec.IID)
        where IID = rec.IID;
END LOOP;
END;

EXECUTE looping;

Ответы [ 2 ]

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

Одним буквальным ответом на ваш вопрос «Как сохранить данные из оператора SELECT и использовать эти данные [для цикла] с оператором UPDATE» будет такой оператор:

UPDATE 
    (SELECT src.E_NOME, dst.I_NOME
    FROM DAT_CCNCONFIG0 
        JOIN DATMCCN0 src ON DAT_CCNCONFIG0.I_NOME = scr.CAPLIC 
        JOIN DATMCCN0 dst ON src.IID = dst.IID)        
SET E_NOME = I_NOME;

Однако этоне решает вашу проблему, что однострочный подзапрос возвращает более одного.Посмотрите ответ MT0 для этого.

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

Вам не нужен цикл, и вы можете сделать все это в одном выражении MERGE (при условии, что ваш коррелированный запрос возвращает одну строку для каждого IID):

CREATE OR REPLACE PROCEDURE looping
IS
BEGIN
  MERGE INTO DATMCCN0 dst
  USING (
    SELECT b.IID,
           I_NOME
    FROM   DAT_CCNCONFIG0 a
           INNER JOIN DATMCCN0 b
           ON a.I_NOME = b.CAPLIC
  ) src
  ON ( src.IID = dst.IID)
  WHEN MATCHED THEN
    UPDATE SET E_NOME = src.I_NOME;
END;

Если это не так,вам нужно будет получить только одну строку, примерно так:

CREATE OR REPLACE PROCEDURE looping
IS
BEGIN
  MERGE INTO DATMCCN0 dst
  USING (
    SELECT b.IID,
           MAX( I_NOME ) AS I_NOME
    FROM   DAT_CCNCONFIG0 a
           INNER JOIN DATMCCN0 b
           ON a.I_NOME = b.CAPLIC
    GROUP BY b.IID
  ) src
  ON ( src.IID = dst.IID)
  WHEN MATCHED THEN
    UPDATE SET E_NOME = src.I_NOME;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...