2

これはばかげた考えかもしれません。dbms_output.put_line を使用して新しい .sql スクリプトを生成する Windows バッチ ファイルから呼び出すことができる SQL*Plus .sql スクリプトを作成しようとしています。これは、これまでのスクリプトの内容です。

set echo off;
set serverout on;

conn user@pass;

spool E:\new_script.sql

DECLARE

  CURSOR c_groups IS
    SELECT * FROM table;

  s varchar2(4000);

BEGIN

  dbms_output.put_line('BEGIN');

  FOR x IN c_groups LOOP
    s := 'INSERT INTO TABLE blah VALUES ('''||x.name||''','||x.id||');';
  END LOOP;

  dbms_output.put_line(s);

  dbms_output.put_line('COMMIT;');

  dbms_output.put_line('END;');
  dbms_output.put_line('/');

END;
/

spool off;
exit;

ただし、これを行うと、「PL/SQLプロシージャが正常に完了しました」new_script.sqlとだけ表示されます。実際にメッセージを表示 する方法はありますか?dbms_out.put_line

そして、私は実際に挿入ステートメントを作成するためにこれを行っているわけではありません。これらは、私がやろうとしていることの要点を示す単純なサンプルです。

4

2 に答える 2

4
  1. 最初に接続してからSETコマンドを使用する必要があります。だからあなたの3つのコマンドは

    この注文:

    conn user@pass;
    set echo off;
    set serverout on;
    

    それ以外の場合、serveroutputパラメーターはデフォルトに設定されます

    値でありOFF、その理由dbms_output.put_line()

    期待どおりに機能していません。

  2. ループdbms_output.put_line(s)内で実行する必要が あります。FOR

    FOR x IN c_groups LOOP
       s := 'INSERT INTO TABLE blah VALUES ('''||x.name||''','||x.id||');';
       dbms_output.put_line(s);
    END LOOP;
    

    さらに、スプール BEGIN .. END ブロックには冗長です。DML ステートメント

    (この場合、ステートメントの束INSERT INTO)セミコロンで終了します

    ブロックに含まれることなく問題なく実行されBEGIN ENDます。

  3. ファイルを使用してスクリプトを実行する*.batと、おそらく

    次のコマンド:

    set feedback off;  -- To not spool messages like 
                       -- PL/SQL procedure successfully completed
    
    set termout off;   -- to suppress the output from a command line.
    
  4. あなたのアプローチは、おそらく簡単なSELECTステートメントに要約できます。

    conn user@pass;
    
    set echo off;
    set serverout on;
    set feedback off;
    set termout off;
    set heading off;
    
    spool E:\new_script.sql
    
    SELECT 'INSERT INTO TABLE blah VALUES ('''||name||'''','||to_char(id)||');'
     FROM table;
    
    spool off;
    
    exit;
    
于 2013-08-21T17:43:50.400 に答える
1

SPOOL結果をファイルに送信します。ただし、結果が印刷されることは保証されません。stdout への出力を有効にするには; コマンドを使用しSERVEROUTPUTます。

set serveroutput on

これは一般的に、物事を進める上で不適切な方法です。これはあなたが実際に行っていることではないとおっしゃいましたが、SQL はセットベースの言語です。可能な限り一括で処理します。

于 2013-08-21T17:15:07.743 に答える