1

我在游标的帮助下运行了一些 Oracle 程序,并通过 dbms_output.put_line 在日志文件中获取输出。

我想做的是在 server_name 上换行,dbms_output.put_line 可以吗?

目前它列出了所有看起来不整洁的东西。

还有一些服务器 id 显示为 1234.9 或 1234.88,是否可以设置像 999.99 这样的 numformat?不知怎的,我不能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

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;
于 2015-01-15T22:07:17.090 回答
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到游标查询中。除了,您在过滤vServerand时只是在寻找单个服务器名称和 ID vServerID,因此您的原始查询无论如何都无法产生原始输出......

于 2015-01-15T22:05:47.087 回答