bugfix> sql > 投稿

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 件
  • ループは不要で、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;
    
    

  • 「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の答えを見てください。

あなたの答え