七月 14, 2023
Oracle 的 DBMS_OUTPUT 包通常用于调试或显示来自 PL/SQL 过程的输出消息。
Oracle 用法
例子
在以下示例中,DBMS_OUTPUT
的PUT_LINE
与绑定变量配合一起使用,以动态构造字符串并从 Oracle PL/SQL 过程中将通知打印到屏幕。要在屏幕上显示通知,必须使用SET SERVEROUPUT ON
配置会话。
SET SERVEROUTPUT ON
DECLARE
CURSOR c1 IS
SELECT last_name, job_id FROM employees
WHERE REGEXP_LIKE (job_id, 'S[HT]_CLERK')
ORDER BY last_name;
v_lastname employees.last_name%TYPE; -- variable to store last_name
v_jobid employees.job_id%TYPE; -- variable to store job_id
BEGIN
OPEN c1;
LOOP -- Fetches 2 columns into variables
FETCH c1 INTO v_lastname, v_jobid;
DBMS_OUTPUT.PUT_LINE ('The employee id is:' || v_jobid ||
' and his last name is:' || v_lastname);
EXIT WHEN c1%NOTFOUND;
END LOOP;
CLOSE c1;
END;
除了在屏幕上输出信息外,DBMS_OUTPUT
包中的PUT
和PUT_LINE
过程还使您能够将信息放在缓冲区中,稍后可由另一个 PL/SQL 过程或包读取。可以使用GET_LINE
和GET_LINES
过程显示以前缓冲的信息。
有关详细信息,请参阅 Oracle 文档中的 DBMS_OUTPUT。
PostgreSQL 用法
您可以使用 PostgreSQL RAISE
语句作为DBMS_OUTPUT
的替代方法。您可以在RAISE
语句中指定错误严重级别,包括:
严重级别 | 用法 |
---|---|
DEBUG1..DEBUG5 |
提供连续更详细的信息供开发人员使用。 |
INFO |
提供用户隐式请求的信息 |
NOTICE |
提供可能对用户有帮助的信息 |
WARNING |
提供可能问题的警告 |
ERROR |
报告导致当前命令中止的错误。 |
LOG |
向管理员报告感兴趣的信息,例如检查点活动。 |
FATAL |
报告导致当前会话中止的错误。 |
PANIC |
报告导致所有数据库会话中止的错误。 |
例子
使用RAISE DEBUG
(其中DEBUG
是可配置的严重性级别)实现与 Oracle DBMS_OUTPUT.PUT_LINE
类似的功能。
SET CLIENT_MIN_MESSAGES = 'debug';
-- Equivalent To Oracle SET SERVEROUTPUT ON
DO $$
BEGIN
RAISE DEBUG USING MESSAGE := 'hello world';
END $$;
DEBUG: hello world
DO
使用client_min_messages
参数可以控制发送到客户端的消息级别。缺省值为NOTICE
。使用 log_min_messages 参数可以控制将哪些消息级别写入服务器日志。缺省值为WARNING
。
SET CLIENT_MIN_MESSAGES = 'debug';
有关详细信息,请参阅 PostgreSQL 文档中的错误和消息和何时记录日志。
总结
特征 | Oracle | PostgreSQL |
---|---|---|
禁用消息输出。 | DISABLE |
配置“client_min_message”或“log_min_message”以获得所需的结果。 |
启用消息输出。 | ENABLE |
配置“client_min_message”或“log_min_message”以获得所需的结果。 |
从缓冲区中检索一行。 | GET_LINE |
请考虑将消息存储在数组或临时表中,以便可以从其他过程或包中检索它们。 |
从缓冲区检索行数组。 | GET_LINES |
请考虑将消息存储在数组或临时表中,以便可以从其他过程或包中检索它们。 |
终止用 创建的行,并在缓冲区中放置部分行。PUT |
PUT + NEW_LINE :BEGIN DBMS_OUTPUT.PUT ('1,'); DBMS_OUTPUT.PUT('2,'); DBMS_OUTPUT.PUT('3,'); DBMS_OUTPUT.PUT('4'); DBMS_OUTPUT.NEW_LINE(); END; / |
在调用RAISE 之前,将消息字符串存储并拼接在一个 varchar 变量中:do $$ DECLARE message varchar :=''; begin message := concat(message,'1,'); message := concat(message,'2,'); message := concat(message,'3,'); message := concat(message,'4,'); RAISE NOTICE '%', message; END$$; |
将行放在缓冲区中 | PUT_LINE |
RAISE |
返回最近异常的数字代码 | SQLCODE + SQLERRM |
SQLSTATE + SQLERRM |
返回与其错误号参数关联的错误消息。 | DECLARE Name employees.last_name%TYPE; BEGIN SELECT last_name INTO name FROM employees WHERE employee_id = -1; EXCEPTION WHEN OTHERS then DBMS_OUTPUT.PUT_LINE (CONCAT('Error code ', SQLCODE,': ',sqlerrm); END; / |
do $$ declare Name employees%ROWTYPE; BEGIN SELECT last_name INTO name FROM employees WHERE employee_id = -1; EXCEPTION WHEN OTHERS then RAISE NOTICE 'Error code %: %', sqlstate, sqlerrm; end$$; |
有关详细信息,请参阅 PostgreSQL 文档中的 PostgreSQL 错误代码。