1

カーソルを使用していくつかの Oracle プロシージャを実行し、dbms_output.put_line を介してログファイルに出力を取得します。

server_name で改行したいのですが、dbms_output.put_line で可能ですか?

現在、整頓されていないように見えるすべてをまとめてリストしています。

また、一部のサーバー ID は 1234.9 または 1234.88 として表示されます。numformat を 999.99 のように設定することは可能ですか? col server_id for 999.99どういうわけか私は手順内でできません。

create procedure proc (vServer IN VARCHAR2, vServerID IN NUMBER)

IS
CURSOR curTable
IS

SELECT server_name, server_id
FROM tab1
WHERE server_name = vServer
and server_id = vServerID;

BEGIN

FOR rec1 IN curTable
LOOP

dbms_output.put_line(rec1.server_name || '   '|| rec1.server_id);

END LOOP;

END proc;

必要な出力の例:

S1    1234
S1    1234
S1    1234

S2    5678
S2    5678
4

2 に答える 2

1

これは単純な SQL で行うように思えますが、これが PL/SQL の演習であると仮定すると、変数を使用して最後に表示された値を追跡し、変更された場合は追加の行を追加できます。

...
  last_server_name tab1.server_name%type;

BEGIN

  FOR rec1 IN curTable
  LOOP
    if last_server_name is not null
        and rec1.server_name != last_server_name then
      dbms_output.new_line;
    end_if;

    dbms_output.put_line(rec1.server_name
      || '   '|| to_char(rec1.server_id, '99990.00'));

    last_server_name := rec1.server_name;
  END LOOP;

END proc;

適切な形式モデルであればto_char()、呼び出し内で使用できます-とにかく暗黙の変換を行っています。dbms_outputまたは、ループ内で ID を数値として使用しない場合は、カーソル内。

set serveroutput onたとえば、クライアントが設定されている場合にのみ、出力が表示されることに注意してください。通常、これに依存することはできないため、dbms_outputデバッグ以外の目的で実際のコードで使用することはお勧めできません。

Scott K. が指摘したように、これを機能させるにはカーソルの結果を並べ替える必要があるためorder by server_name、カーソル クエリに追加します。vServerただし、 andでフィルタリングしているため、とにかく単一のサーバー名と ID のみを探しているvServerIDため、元のクエリでは元の出力を生成できません...

于 2015-01-15T22:05:47.087 に答える