0

.sql ファイル内に 2 つのコード ブロックがあります。1 つのブロックは関数で、もう 1 つのブロックはプロシージャです。最初のブロックでは、クエリを実行し、それを画面に出力します (私は DBMS_OUTPUT.PUT_LINE() を使用しています)。行ごとに行ごとに出力します。次に、プロシージャには、同じ行に出力する必要がある別のクエリがあります (私は DBMS_OUTPUT.PUT() を使用しています)。2 番目のブロックに DBMS_OUTPUT.PUT() を使用すると、何らかの理由で最初のブロックが台無しになり、最初のブロックが印刷されません。

コードへのリンクは次のとおりです: http://pastebin.com/z29emmBJ (コードの関連部分は行の周りです: 97-103)

プロシージャ内で DBMS_OUTPUT.PUT_LINE() を使用すると、すべてが正しく表示されますが、プロシージャ内で DBMS_OUTPUT.PUT() を使用すると、関数が呼び出されないように見えます。

PUT_LINE() を使用した出力は次のようになります: http://i.imgur.com/AnCv9.png PUT() だけを使用した出力は次のようになります: http://i.imgur.com/Jv3SV.png

バッファサイズと関係があると思いますが、何が/なぜなのか正確にはわかりません。

どんな助けでも大歓迎です!

4

2 に答える 2

3

必要に応じて結果を VARCHAR2 変数に追加し、行が完成したときにその文字列を put_line してみませんか? そうすれば、フォーマットを制御できます。

于 2012-10-22T02:58:53.033 に答える
1

2 番目のストアド プロシージャのコードのスニペット:

FOR player IN rows LOOP
   currentCount := maxCount;
   DBMS_OUTPUT.PUT(player.FIRSTNAME || ' ' || player.LASTNAME || ':' || player.points || ' ');
   --DBMS_OUTPUT.NEW_LINE();
END LOOP;

結果の出力を 1 行で表示したい場合は DBMS_OUTPUT.NEW_LINE()、ループの外 (ループの後) に移動する必要があります。したがって、コードは次のようになります。

FOR player IN rows LOOP
  currentCount := maxCount;
  DBMS_OUTPUT.PUT(player.FIRSTNAME || ' ' || player.LASTNAME || ':' || player.points || ' ');         
END LOOP;
DBMS_OUTPUT.NEW_LINE();

手順をエミュレートしDBMS_OUTPUT.NEW_LINE();た後、ループ内に保持します。DBMS_OUTPUT.PUTDBMS_OUTPUT.PUT_LINE

SQL> create or replace procedure output1
  2  is
  3    l_str varchar2(100);
  4    l_status number;
  5  begin
  6    for i in 1..7
  7    loop
  8      dbms_output.put('Text_' || To_char(i));
  9      dbms_output.new_line;
 10    end loop;
 11  end;
 12  /

Procedure created

SQL> 
SQL> create or replace procedure output2
  2  is
  3    l_str varchar2(100);
  4    l_status number;
  5  begin
  6    for i in 1..7
  7    loop
  8      dbms_output.put('Text_' || To_char(i));
  9     end loop;
 10     dbms_output.new_line;
 11  end;
 12  /

Procedure created

SQL> exec output1;

Text_1
Text_2
Text_3
Text_4
Text_5
Text_6
Text_7

PL/SQL procedure successfully completed

SQL> exec output2;

Text_1Text_2Text_3Text_4Text_5Text_6Text_7

PL/SQL procedure successfully completed

あなたのコードで:

SET serveroutput ON size 32000;

REM Change output file name TO proj3-NetID.OUT!
SPOOL proj3-hgeorge3.OUT;
exec DBMS_OUTPUT.enable('100000000');

オプションを使用する(ON に設定する)場合は、呼び出し手順serveroutputは必要ありません 。DBMS_OUTPUT.enableそして、それが呼び出されDBMS_OUTPUT.enableた場合、数値データ型の値は、文字列ではなくパラメーターとして渡される必要があります。はい、データ型の暗黙的な変換が行われますが、回避することをお勧めします。また、バッファの最大サイズは 100 万です。

于 2012-10-22T06:50:41.133 に答える