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

Sql 如何存储SELECT语句中的数据并使用该数据与UPDATE语句循环,sql,oracle,plsql,Sql,Oracle,Plsql,我正在使用PLSQL,我想将查询结果表单SELECT语句存储在一个数组中,然后我想使用该数组中的元素循环更新所有行。下面代码的问题是它返回一行。子查询返回多行,因为他试图在一行中设置多个变量。在这种情况下你能帮我吗 这是我的代码: CREATE OR REPLACE PROCEDURE looping IS BEGIN FOR rec IN (SELECT IID FROM DATMCCN0) LOOP UPDATE DATMCCN0 SET E_

我正在使用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;

您不需要循环,可以在一个MERGE语句中完成所有操作,前提是相关查询为每个IID返回一行:

如果没有,则只需要获得一行,如下所示:

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;
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;

对于如何存储SELECT语句中的数据并将该数据[to loop]与UPDATE语句一起使用的问题,一个字面上的答案如下:

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;
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的答案。

我给你的这个解决方案发生了什么:?从错误中,看起来你在内部选择中得到了多个iid和caplic组合的值。您需要决定在相应的更新中使用哪个值,max,min。或应添加其他条件以筛选唯一行