在PL / SQL中创建文本网格

时间:2018-07-26 15:27:50

标签: oracle plsql

我正在尝试创建一个像这样的网格

produce | price
________________
Apple   | $1.3
________________
Orange  | $ 2.6

垂直边框是可选的。

现在这就是我所拥有的

stringBuilder := '';
for i in (select * from produces) loop
    stringBuilder := stringBuilder || ' ' || i.name || ' ' || i.price || chr(10);
end loop;

,但以上查询无法生成正确的格式。它创建的是:

Apple $1.3 

Orange $1.6

对齐不均匀。

1 个答案:

答案 0 :(得分:2)

这应该作为一个简单的查询而不是通过PL / SQL来完成,但是大概这是您已经专门在PL / SQL中进行的练习...

您需要填充表中的值,以便它们都具有相同的长度。您也不希望当前正在串联的多余空间。

简单示例:

set serveroutput on

declare
  stringBuilder varchar2(4000);
begin
  stringBuilder := ''; -- default is null anyway
  for i in (select * from produces) loop
    stringBuilder := stringBuilder || rpad(i.name, 10)
      || ' ' || lpad(i.price, 5) || chr(10);
  end loop;
  dbms_output.put_line(stringBuilder);
end;
/

Apple       $1.3
Orange      $2.6

PL/SQL procedure successfully completed.

您需要为数据适当设置填充值。而且,如果您向任一填充量加上一个,则不需要将显式' '连接到字符串中。


您在评论中说,这将作为电子邮件的一部分发送;但是,即使您包括正确的填充以使其看起来像对齐的一样,您仍然依赖于邮件客户端以等宽字体呈现它。如果客户端使用比例字体,则它将再次看起来不正确(如this example from Gmail)。最好将其作为HTML表发送,并在电子邮件上带有适当的MIME类型标题。 (或者,也可以作为纯文本附件-如果可以确定收件人将在等宽字体编辑器中将其打开...)