PL/SQLのコンパイルが「PLS-00302: コンポーネント’xxxxx’を宣言してください。」で失敗する問題の対処

PL/SQLの作成中に以下のようなエラーが出てコンパイルに失敗することがあります。

直接的な原因は、
PLS-00302: コンポーネント’xxxxx’を宣言してください。
のように、コンポーネントの宣言が間違っているため、認識されていないことによります。
たいていは綴りの間違いや記述場所が間違っている場合が多いですが、どう見てもあっているのに、、と思う場合があります。
というより、ありました。
その際は小文字のテーブル名、カラム名を使用していたため、うまく認識されていなかったのです。

まず、Oracleは通常、テーブル名やカラム名で大文字・小文字を区別しません。
そのため、小文字のテーブル名、カラム名を使用する場合は、「”」で囲って、”table_name”のように記述することで、区別することができます。


さて、記事のエラーですが

DECLARE
 
  sql_stmt VARCHAR2(400);
 
  CURSOR cur_tbls IS
    SELECT "column_a" FROM  "table_a";
 
BEGIN
 
  FOR w_rec IN cur_tbls LOOP
 
    sql_stmt := 'UPDATE "table_a" SET "column_a" =  '''' || w_rec.column_a  || '''';
 
    EXECUTE IMMEDIATE sql_stmt;
 
  END LOOP;
END;
/

のように記述すると、

PLS-00302: コンポーネント’column_a’を宣言してください。

のようなエラーが出てしまいます。

これは、該当のコンポーネントが「column_a」 ではなく、「COLUMN_A」で認識されているためです。

そのため、このエラーを回避するためには、

SELECT “column_a” as COLUMN_A FROM  “table_a”;

のように、大文字で別名を付けてあげるとよいです。