

カーソルを使ってSQLをjoinして挿入しようとすると「列名の重複を避けるためにはカーソルのSELECTリストに別名が必要です。」とエラーが出ます。なぜなのでしょうか？  
下の部分が何か間違っているのでしょうか？

[code]

    r_ABC c_ABC%ROWTYPE;  -- SELECTで取得したレコードを代入する変数の定義
    v_CNT NUMBER:= 0;
    
        BEGIN
            OPEN c_ABC;
            　　LOOP
                FETCH c_ABC INTO r_ABC;
                EXIT WHEN c_ABC%NOTFOUND;
                    v_CNT := v_CNT + 1;
    
[/code]


CC BY-SA 4.0
2020-07-06T08:18:13.350
68336
2023-05-30T15:11:11.393
2020-07-06T08:28:46.377
3060
28442
question
sql
PL/SQLのカーソルについて


質問文のコードではなく`c_ABC`で記述しているselect文が間違っている可能性があります。

今回ご質問のエラーはOracleの`PLS-00402`かと思います。  
[Oracleのドキュメント](https://docs.oracle.com/cd/E82638_01/errmg/PLS-00049.html)では該当エラーについて下記のように書かれています。

> PLS-00402: 列名の重複を避けるためにはカーソルのSELECTリストに別名が必要です。  
>  原因: 重複する列名を含むSELECT文でカーソルが宣言されています。この参照は、不明確です。  
>  処置: SELECTリストで重複している列名を別名で置き換えてください。

上記の通りカーソルのselect文で同一の列名を取得しようとすると、不明確な参照としてエラーが発生します。  
カーソルに使用する列名は重複しないように別名を定義してみてください。

下記はNGとOKになるストアドのサンプルコードです。  
5行目をコメント化して7行目のコメントを削除するとコンパイルが通ります。

[code]

    CREATE OR REPLACE PROCEDURE TEST00402
    IS
      CURSOR c_ABC IS
          -- NGなSELECT文
          SELECT  a.val, b.val
          -- OKなSELECT文
       -- SELECT  a.val as a_val, b.val as b_val
            FROM  (select 1 idx, 'hoge' val  from dual) a
                 ,(select 1 idx, 'fuga' val  from dual) b
            WHERE  a.idx = b.idx;
      r_ABC  c_ABC%ROWTYPE;
    BEGIN
      OPEN c_ABC;
      LOOP
        FETCH c_ABC INTO r_ABC;
        EXIT WHEN c_ABC%NOTFOUND;
      END LOOP;
      CLOSE c_ABC;
    END;
    /
    
[/code]


CC BY-SA 4.0
2020-07-06T09:30:59.687
68338
2020-07-06T09:30:59.687
9820
68336
answer