我在游标的帮助下运行一些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
答案 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
添加到游标查询中。但是,除非您在vServer
和vServerID
上进行过滤,否则您只需查找单个服务器名称和ID,因此您的原始查询无法生成原始输出反正...