PL/SQL错误处理
最近更新时间: 2024-10-17 17:10:00
PL / SQL使检测和处理错误变得容易。
发生错误时,PL/ SQL会引发异常。正常执行停止并控制传输到PL/ SQL块的异常处理部分。通过以下几个示例,说明错误处理类型。
RAISE NOTICE
postgres=# CREATE OR REPLACE FUNCTION f28() RETURNS VOID AS
postgres-# $$
postgres$# DECLARE
postgres$# v_int INTEGER := 1;
postgres$# BEGIN
postgres$# RAISE NOTICE 'v_int = %, 随机数 = %',v_int,random();
postgres$# END;
postgres$# $$
postgres-# LANGUAGE plpgsql;
CREATE FUNCTION
postgres=# SELECT f28();
NOTICE: v_int = 1, 随机数 = 0.236714988015592
结果为
f28
-----
(1 row)
使用raise notice 向终端输出一个消息,也有可能写到日志中(需要调整日志的保存级别)
RAISE EXCEPTION
postgres=# CREATE OR REPLACE FUNCTION f28() RETURNS VOID AS
postgres-# $$
postgres$# DECLARE
postgres$# v_int INTEGER := 1;
postgres$# BEGIN
postgres$# RAISE EXCEPTION '程序EXCEPTION ';
postgres$# --下面的语句不会再执行
postgres$# RAISE NOTICE 'v_int = %, 随机数 = %',v_int,random();
postgres$# END;
postgres$# $$
postgres-# LANGUAGE plpgsql;
CREATE FUNCTION
postgres=# SELECT f28();
ERROR: 程序EXCEPTION
如果在事务中执行这个函数,则事务会中止(abort)
RAISE EXCEPTION 自定义ERRCODE
postgres=# CREATE OR REPLACE FUNCTION f28() RETURNS VOID AS
postgres-# $$
postgres$# DECLARE
postgres$# v_int INTEGER := 1;
postgres$# BEGIN
postgres$# RAISE EXCEPTION ' 程序EXCEPTION ' USING ERRCODE = '23505';
postgres$# END;
postgres$# $$
postgres-# LANGUAGE plpgsql;
CREATE FUNCTION
postgres=# SELECT f28();
ERROR: 程序EXCEPTION
日志中会记录这个ERRCODE
2017-10-03 18:40:16.710 CST,"pgxz","postgres",15072,"[local]",59d33b65.3ae0,225,"idle",2017-10-03 15:25:25 CST,4/367159,0,LOG,00000,"statement: SELECT f28();",,,,,,,,,"psql"
2017-10-03 18:40:16.710 CST,"pgxz","postgres",15072,"[local]",59d33b65.3ae0,226,"SELECT",2017-10-03 15:25:25 CST,4/367159,0,ERROR,23505," 程序EXCEPTION ",,,,,,,,,"psql"