ここで 2 つの問題があります。メッセージは、identifier ONE must be declared
置換変数を引用していないためです。持っている場合はset verify on
、次のように表示されます。
Enter value for source_ats_user_schema: ONE
old 2: source varchar2(100) := &SOURCE_ATS_USER_SCHEMA;
new 2: source varchar2(100) := ONE;
source varchar2(100) := ONE;
*
ERROR at line 2:
ORA-06550: line 2, column 25:
PLS-00201: identifier 'SCOTT' must be declared
ORA-06550: line 2, column 8:
PL/SQL: Item ignored
'd 位置は、意味*
がわからないことを示していONE
ます。ここでは文字列として扱いたいので、次のようにする必要があります。
source varchar2(100) := '&SOURCE_ATS_USER_SCHEMA';
...表示されます:
Enter value for source_ats_user_schema: ONE
old 2: source varchar2(100) := '&SOURCE_ATS_USER_SCHEMA';
new 2: source varchar2(100) := 'ONE';
...これは有効です。それが行く限り; まだ2番目のエラーがあるため、これは実際には役に立ちません:
select ID from source.WEB_FE;
*
ERROR at line 4:
ORA-06550: line 4, column 27:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 4, column 5:
PL/SQL: SQL Statement ignored
エラーがsource.WEB_FE
ではなく ONE.WEB_FE
を参照していることに注意してください。source
は代用されていません。一般に、@NicholasKrasnov が彼の回答で示している方法の 1 つを使用する必要がありますが、実際にはこれを必要以上に複雑にしています。この特定のケースでは、宣言する必要はまったくありませんsource
。次のようにするだけです。
CURSOR cur_list is
select ID from &SOURCE_ATS_USER_SCHEMA..WEB_FE;
今言ったこととは反対に、ここでは置換変数を引用する必要はありませんが、テーブル名の前の.
実数をターミネータとして扱うのを止めるために、明示的に で終了する必要があることに注意してください。(そうしない場合に何が起こるかを確認するため.
に、余分なものなしで試してみてください)。.
実行するとプロンプトが表示され、検証出力は次のようになります。
Enter value for source_ats_user_schema: ONE
old 3: select ID from &SOURCE_ATS_USER_SCHEMA..WEB_FE;
new 3: select ID from ONE.WEB_FE;
ご覧のとおり、指定したスキーマでテーブルを探しています。これは依然として動的ですが、特別な SQL*Plus の方法です。
ただし、これらの方法では、SQL インジェクションの可能性を考慮する必要があります。