迁移 Oracle 到 PostgreSQL: DBMS_OUTPUT 包

七月 14, 2023

Oracle 的 DBMS_OUTPUT 包通常用于调试或显示来自 PL/SQL 过程的输出消息。

Oracle 用法

例子

在以下示例中,DBMS_OUTPUTPUT_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包中的PUTPUT_LINE过程还使您能够将信息放在缓冲区中,稍后可由另一个 PL/SQL 过程或包读取。可以使用GET_LINEGET_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 错误代码