如何为 PL/SQL 中的 dbms 输出打印的值提供别名?

Posted

技术标签:

【中文标题】如何为 PL/SQL 中的 dbms 输出打印的值提供别名?【英文标题】:How do I give an alias name to the values printed by dbms output in PL/SQL? 【发布时间】:2021-03-07 10:23:32 【问题描述】:

我有以下代码,它从部门号小于 40 的部门表中打印部门号和部门名称。

declare
cursor cn is select dno, dname from dept where dno<40;
v_dno dept.dno%type;
v_dname dept.dname%TYPE;
begin
    open cn;
        loop
            fetch cn into v_dno,v_dname;
            dbms_output.put_line(v_dno||' '||v_dname);
            exit when cn%notfound;
        end loop;
    close cn;
end;

这是我得到的输出:

10 Administration
20 Marketing
30 Purchasing
30 Purchasing

但我期待的输出是:

Department_No   Department_Name
10              Administration
20              Marketing
30              Purchasing
30              Purchasing

【问题讨论】:

除了其他 cmets,您还需要了解 dbms_output 完全在数据库引擎内部执行,not 写入屏幕也是如此。它写入内部缓冲区。过程完成后,当控制权返回给调用客户端时,客户端可能(或可能不)选择处理该缓冲区并显示结果。因此,将 dbms_output 用于演示或调试以外的用途并不是一个好主意。 【参考方案1】:

PL/SQL 只输出我们明确传递给 DBMS_OUTPUT 的内容。所以,如果你想要标题,你需要自己提供:

declare
cursor cn is select dno, dname from dept where dno<40;
v_dno dept.dno%type;
v_dname dept.dname%TYPE;
begin
    dbms_output.put_line('Department_No   Department_Name');
    open cn;
        loop
            fetch cn into v_dno,v_dname;
            dbms_output.put_line(rpad(to_char(v_dno),14)||' '||v_dname);
            exit when cn%notfound;
        end loop;
    close cn;
end;

请注意,要获得整齐的对齐,您需要使用RPAD() 使 V_DNO 与标题的长度相同

【讨论】:

非常感谢 :)))) 但是为什么要把 V_dno 改成字符呢? 因为它更清晰。 DBMS_OUTPUT.PUT_LINE 只显示字符串,因此它隐式将 V_NO 转换为 varchar2。我只是认为将这些事情明确化是更好的做法。 感谢您提供此信息。从现在开始会跟进。【参考方案2】:

您必须单独显示它(参见第 10 行)(我使用了 Scott 的示例 DEPT 表格,因为我没有您的表格):

SQL> DECLARE
  2     CURSOR cn IS
  3        SELECT deptno, dname
  4          FROM dept
  5         WHERE deptno < 40;
  6
  7     v_deptno  dept.deptno%TYPE;
  8     v_dname   dept.dname%TYPE;
  9  BEGIN
 10     DBMS_OUTPUT.put_line ('Department_no   Department_name');
 11
 12     OPEN cn;
 13
 14     LOOP
 15        FETCH cn INTO v_deptno, v_dname;
 16
 17        DBMS_OUTPUT.put_line (RPAD (v_deptno, 15, ' ') || ' ' || v_dname);
 18        EXIT WHEN cn%NOTFOUND;
 19     END LOOP;
 20
 21     CLOSE cn;
 22  END;
 23  /
Department_no   Department_name
10              ACCOUNTING
20              RESEARCH
30              SALES
30              SALES

PL/SQL procedure successfully completed.

SQL>

【讨论】:

【参考方案3】:

您可以编写 plsql 和 html 代码的组合。一样

declare
cursor cn is select dno, dname from dept where dno<40;
begin
htp.p('<table>
    <tr>
        <th>Department_no<\th>
        <th>Department_name<\th>
    <\tr>');
for i in cn
    loop
htp.p('<tr>
        <td>'|| i.dno ||'<\td>
        <td>'|| i.dname ||'<\td>
    <\tr>');
    end loop;
htp.p('<\table>');
end;

【讨论】:

以上是关于如何为 PL/SQL 中的 dbms 输出打印的值提供别名?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在PL/Sql程序运行时打印新旧值。?

从 oracle PL/SQL 查看变量的值

Oracle PL/SQL 中的漂亮打印

(十七)PL/SQL DBMS输出

如何在 Oracle 中调试 PL/SQL 集合的值?

如何为 PL SQL 中的现有表创建唯一 ID?