dbms_output.put_line 中的换行符

Line break in dbms_output.put_line

我 运行 一些 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

这看起来像是你用普通 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;

您可以在 dbms_output 调用中使用 to_char(),使用任何合适的格式模型 - 无论如何您都在进行隐式转换;或者在游标中,如果您没有在循环中将 ID 作为数字输入。

请记住,如果您的客户端已设置,您将只能看到输出 - 例如 set serveroutput on。你通常不能依赖它,所以在实际代码中使用 dbms_output 不是一个好主意,除了调试。

正如 Scott K. 指出的那样,您需要对游标结果进行排序才能使其正常工作,因此请将 order by server_name 添加到游标查询中。除了,您在 vServervServerID 上进行过滤时,无论如何您只是在寻找一个服务器名称和 ID,因此您的原始查询无论如何都无法产生原始输出...

仅当您将该列指定为排序顺序时,在 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;