如何为 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 输出打印的值提供别名?的主要内容,如果未能解决你的问题,请参考以下文章