Windows 用の SQL*Plus スクリプト:
set define "&" set verify off define mytable = dual accept param prompt "Enter option 1-9: " -- Generate a script named prompt_for_tablename.sql which prompts the user for a table name -- or does nothing, depending on the value of ¶m: set termout off column mytable new_value mytable set head off feedback off spool prompt_for_tablename.sql select 'accept mytable char prompt "Enter table name: "' as prompt from dual where ¶m = 1; spool off set termout on head on feedback on @prompt_for_tablename.sql host del prompt_for_tablename.sql declare vari_axu number; begin if ¶m = 1 then dbms_output.put_line ('work here'); select count(*) into vari_axu from &mytable ; dbms_output.put_line('Count of &mytable: ' || vari_axu); return; end if; dbms_output.put_line ('do not work' ); end; /
プレ>ユーザーが
1
を入力した場合 最初のプロンプトで、生成されたスクリプトprompt_for_tablename.sql
テーブル名の入力を求めるプロンプトが表示されます。それ以外の値については、何もしません。次に
prompt_for_tablename.sql
実行されます(そして、もう必要ないのですぐに削除されます)。今&mytable
スクリプトの開始時のデフォルト値、またはユーザーがプロンプトで入力した値のいずれかが含まれます。追加:2 つの変数を持つバージョン
これにより、動的クエリが次のように構築されます:
select count(*) into vari_axu from &mytable where created > date '&busdate';
プレ>デモ目的で、テーブル名を
user_objects
として入力できます (created
は日付列です)。ユーザーが予想される列名を持つテーブルを指定する必要があるため、明らかにこの種の構造は複雑になり、エラーが発生しやすくなります。
set define "&" set verify off define mytable = dual define busdate = "0001-01-01" define if_param_is_1 = "--" accept param prompt "Enter option 1-9: " -- Generate a script named prompt_for_tablename.sql which prompts the user for a table name -- or does nothing, depending on the value of ¶m: set termout off column mytable new_value mytable column if_param_is_1 new_value if_param_is_1 set head off feedback off spool prompt_for_tablename.sql select prompt, null as if_param_is_1 -- uncomment from ( select 'accept mytable char prompt "Enter table name: "'||chr(13)||chr(10) as prompt from dual union all select 'accept busdate date format ''YYYY-MM-DD'' prompt "Enter business date (YYYY-MM-DD): "' from dual ) where ¶m = 1; spool off set termout on head on feedback on @prompt_for_tablename.sql host del prompt_for_tablename.sql declare vari_axu number; begin &if_param_is_1 dbms_output.put_line ('work here'); &if_param_is_1 select count(*) into vari_axu from &mytable where created > date '&busdate'; &if_param_is_1 dbms_output.put_line('Count of &mytable created after &busdate: ' || vari_axu); &if_param_is_1 return; dbms_output.put_line ('do not work' ); end; /
プレ>パラメータを 2 として渡すテスト:
SQL> @demo Enter option 1-9: 2 do not work PL/SQL procedure successfully completed.
プレ>パラメータを 1 として渡すテスト:
SQL> @demo Enter option 1-9: 1 Enter table name: user_objects Enter business date (YYYY-MM-DD): 2010-01-01 work here Count of user_objects created after 2010-01-01: 93772 PL/SQL procedure successfully completed.
プレ>(
successfully completed
を抑制することができますset feedback off
のメッセージ .)