如何存储SELECT语句中的数据并使用该数据循环使用UPDATE语句

时间:2018-05-25 08:49:27

标签: sql oracle plsql

我正在使用PLSQL,我想将查询结果表单存储在一个数组中,然后我想使用该数组中的元素循环来更新所有行。下面的代码的问题是它返回单行。子查询返回多行,因为他试图在一行中设置多个变量。你能在这种情况下帮助我吗?

这是我的代码:

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 :(得分:1)

您不需要循环并且可以在一个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;

答案 1 :(得分:0)

您的问题的一个字面答案“如何从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的答案。