sql >> データベース >  >> RDS >> Oracle

条件が満たされていない場合に置換変数を無視する

    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 &param:
    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 &param = 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 = 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 &param:
    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 &param = 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 のメッセージ .)




    1. PostgreSQL-IN句のパラメータの最大数?

    2. MySQLでクイズのデータ​​ベースを設計するためのガイド

    3. java.sql.SQLException:ローカルホストテストに適したドライバーが見つかりません

    4. IN句でPDOプリペアドステートメントを使用するにはどうすればよいですか?