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
添加到游标查询中。除了,您在 vServer
和 vServerID
上进行过滤时,无论如何您只是在寻找一个服务器名称和 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;
我 运行 一些 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
添加到游标查询中。除了,您在 vServer
和 vServerID
上进行过滤时,无论如何您只是在寻找一个服务器名称和 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;