dbms_output.put_line中的换行符

时间:2015-01-15 21:45:52

标签: oracle stored-procedures dbms-output

我在游标的帮助下运行一些Oracle过程,并通过dbms_output.put_line在logfile中获取输出。

我想做的是在server_name上断行,是否可以使用dbms_output.put_line?

目前它列出了一切看起来并不整洁的东西。

另外一些服务器ID显示为1234.9或1234.88,是否可以设置数字格式为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

2 个答案:

答案 0 :(得分:2)

只有将该列指定为排序顺序时,才能在server_id上执行中断。然后,您必须自己编写中断逻辑。此外,您可以使用TO_CHAR格式化数字。

这是应该做你想做的代码:

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
ORDER BY server_id ;

l_last_server_id tab1.server_id%TYPE := 0;

BEGIN

FOR rec1 IN curTable
LOOP

-- Test for break:
IF last_server_id != rec1.server_id THEN
  -- Break detected:
  dbms_output.put_line('---'); -- DBMS_OUTPUT will not print a blank line.
END IF ;

dbms_output.put_line(rec1.server_name || '   '|| TO_CHAR(rec1.server_id,'999.99');

l_last_server_id := rec1.server_id ;

END LOOP;

END proc;

答案 1 :(得分: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添加到游标查询中。但是,除非您在vServervServerID上进行过滤,否则您只需查找单个服务器名称和ID,因此您的原始查询无法生成原始输出反正...