0

このスニペットはfor、ループのコメントを外さない限りエラーなしで実行されます。

Error report:
ORA-06550: line 12, column 41:
PL/SQL: ORA-00942: table or view does not exist

私の質問は、コメントを外した for ループでエラーが発生するのはなぜですか?

set serveroutput on
declare
  v_sql varchar2(2000);
  v_tmp number;
begin
  dbms_output.enable(null);
  v_sql := 'CREATE TABLE tmp_bank_codes (name varchar2(256), code varchar2(256))';
  dbms_output.put_line('Will do ' || v_sql);
  execute immediate v_sql;
  v_sql := 'INSERT INTO tmp_bank_codes (name, code) VALUES (''Bank of America'', ''BOANY (NY)'')';
  dbms_output.put_line('Will do ' || v_sql);
  execute immediate v_sql;
--for bank_code in (select name, code from tmp_bank_codes) loop
--  select 1 into v_tmp from dual;
--end loop;
execute immediate 'drop table tmp_bank_codes';
rollback;

end;
/
4

3 に答える 3

4

エラーは、動的SQLを使用してテーブルを作成し、forループでテーブルを使用しているためです。プロシージャーのコンパイル中、動的 SQL を使用してテーブルを作成したことをコンパイラーは認識しません。

オプションは次のとおりです。

  1. 動的SQLでもforループを作る
  2. 動的SQLを変更してテーブルを作成し、通常のSQLステートメントにします

動的SQLはキャッシュされた実行計画を取得しないため、クエリが遅くなるため、2番目のオプションをお勧めします

オプション1の場合、これを行うことができます。コメント付きのコード部分を次のように置き換えます

v_sql :='for bank_code in (select name, code from tmp_bank_codes) loop
        select 1 into v_tmp from dual;
        end loop';
execute immediate v_sql;
于 2012-08-30T09:00:50.167 に答える
3

これはパーサー エラーです。tmp_bank_codesコンパイル時には存在しません。

于 2012-08-30T09:00:40.353 に答える
1

最初に、エンジンは匿名スクリプトをコンパイルしようとします。この最初のステップtmp_bank_codesでは、テーブルは存在しません。

解決策は次のようになります

execute immediate `select 1 from tmp_bank_codes where rownum = 1` into v_tmp;
于 2012-08-30T09:02:52.227 に答える