PL/SQL错误处理

最近更新时间: 2024-06-12 15:06: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"