【问题标题】:How do I give an alias name to the values printed by dbms output in PL/SQL?如何为 PL/SQL 中的 dbms 输出打印的值提供别名?
【发布时间】: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 用于演示或调试以外的用途并不是一个好主意。

标签: oracle plsql rdbms database-cursor


【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 2018-07-08
      • 2015-02-24
      • 2012-07-05
      • 2019-07-29
      • 2021-12-01
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多