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

変数引数を外部SQLファイル(SQL*Plusを使用したPL/SQL)に渡したい

    @ SQL*Plusコマンド です。 、PL/SQLでは意味がありません。スクリプトは解析時にPL/SQLブロックに含まれています。これは、list バッファ内のコード。制御ブロックで宣言された変数は、置換を必要とせずに、「インクルード」コードで直接使用できます。

    例として、uitvoer.sqlの場合 含まれているだけです:

    dbms_output.put_line(v_s);
    

    次に、この制御スクリプト:

    set serveroutput on
    declare
      v_s varchar2(10) := 'Test';
    begin
      @uitvoer.sql
    end;
    /
    
    list
    

    生産:

    Test
    
    PL/SQL procedure successfully completed.
    
      1  declare
      2    v_s varchar2(10) := 'Test';
      3  begin
      4  dbms_output.put_line(v_s);
      5* end;
    

    バッファ内のPL/SQLブロックには、コードが含まれていますが、ありません。 uitvoer.sqlへの参照 。ただし、含まれているコードは、まだスコープ内にある制御スクリプトの変数を参照しているため、機能しました。

    異なる名前の制御変数を許可する場合は、uitvoer.sqlを許可します。 おそらくもっと柔軟に呼び出されるために、置換変数を使用することはできますが、値ではなく変数名を置換することになります。たとえば、このuitvoer.sqlでは (置換変数の割り当てはしないことに注意してください 引用符で囲みます):

    declare
      variable_s varchar2(10);
    begin
      variable_s := &&1;
      dbms_output.put_line(variable_s);
    end;
    

    そして、変数名を渡す制御スクリプト:

    declare
      v_s varchar2(10) := 'Test';
    begin
      @uitvoer.sql v_s
    end;
    /
    

    ご覧のとおり:

    old   7:   variable_s := &&1;
    new   7:   variable_s := v_s;
    Test
    
    PL/SQL procedure successfully completed.
    
      1  declare
      2    v_s varchar2(10) := 'Test';
      3  begin
      4  declare
      5    variable_s varchar2(10);
      6  begin
      7    variable_s := &&1;
      8    dbms_output.put_line(variable_s);
      9  end;
     10* end;
    



    1. 週/月間隔の日付範囲でグループ化

    2. Oracleシーケンスをリセットして、MIN VALUE=1およびSTARTING番号を1から設定します。

    3. SQLステートメントのバックティックと角括弧の違いは何ですか?

    4. 参照カーソルを返すOracleプロシージャから、どのようにして適切にフォーマットされた結果を取得しますか?