1

我有一个CURSOR c1声明 a 的过程。然后我想在每个角色c1提取中输出列。

FOR rec IN c1
    LOOP
      DBMS_OUTPUT.PUT_LINE (rec.branchno || CHR(9) || rec.street || CHR(9)
        || rec.city || CHR(9) || rec.postcode);
    END LOOP;

我现在CHR(9)用来输出一个标签。但是,有时rec.city有超过 8 个字符,因此一个制表符会将以下内容postcode向右推一个制表符,如下面的第二行输出所示。

B003    163 Main St.    Glasgow G11 9QX         
B007    16 Argyll St.   Aberdeen    AB2 3SU 
B005    22 Deer Rd.     London  SW1 4EH    

有没有办法DBMS_OUTPUT自动调整标签?例如,

IF STRLEN(rec.city) < 8
    PUT ( CHR(9) || CHR(9) )
ELSE
    PUT ( CHR(9) )
END IF;

如果不是,生成这种格式化输出的行业惯例是什么?

谢谢您的帮助。

4

4 回答 4

2

使用DBMS_OUTPUT生成格式化报告可能是错误的方法。

SQL*Plus 非常擅长生成固定宽度的文本报告。存储过程是否添加了一些值(在这种情况下,您可以让它返回到 SQL*Plus)或者将 SQL 语句与适当的命令sys_refcursor一起放入 SQL*Plus 脚本中是否更有意义,这并不明显column format控制数据的输出。任何数量的其他工具(例如 SQL Developer)都支持足够的 SQL*Plus 命令以生成简单的固定宽度报告。

于 2014-02-20T22:41:18.280 回答
2

CURSOR当我在. 中使用 a时,我遇到了同样的问题PROCEDURE。我使用以下类似的代码来解决我的问题。希望,这可能对你有所帮助。

 DBMS_OUTPUT.PUT_LINE(RPAD(rec.branchno,10)||RPAD(rec.street,20)||RPAD(rec.city,20)||RPAD(rec.city,20)); 

RPAD函数实际上将表达式的右侧填充到指定的长度。填充可以使用指定的字符,但它是可选的。如果要填充的表达式的长度大于指定长度,则仅显示符合指定长度的部分。

RPAD(表达式,填充长度,填充字符(可选));

RPAD('school',10);

输出:school

RPAD('school',6);

输出:school

RPAD('school',2);

输出:sc

RPAD('school',10,'1');

输出:school1111

于 2016-07-22T15:26:28.493 回答
1

这会给你你想要的:

SELECT RPAD (BRANCHNO, 5) c1, 
       RPAD (STREET, 15) c2, 
       RPAD (CITY, 10) c3, 
       RPAD (POSTCODE, 10) c4
 FROM RECORD;

http://sqlfiddle.com/#!4/96e4a/8/3

于 2014-02-20T23:01:04.927 回答
0
v_padlength number; 
v_sku_desc varchar2(30);
v_pad varchar2(1) := ' ';


if length(v_sku_desc) <= 11 then 
     v_padlength   := 35-length(v_sku_desc); 
 else
     v_padlength   := 30-length(v_sku_desc); 
 end if;                                             
 DBMS_OUTPUT.PUT_LINE (v_sku_desc||lpad(v_pad,v_padlength,' ')||chr(9)||'aligned');

set the <= 11 to needed length and adjust the 35 for the shorter fields
于 2017-08-24T19:29:15.510 回答