加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL 9.5:异常处理

发布时间:2020-12-13 16:00:16 所属栏目:百科 来源:网络整理
导读:我有一个名为employee的表,有两列,并为其创建了两个函数 插入和更新操作.这两个函数将通过另一个函数调用 名为udf_3()的函数. 我想对第三个函数udf_3()进行异常处理 给我详细说明哪个函数有错误. – 表:员工 create table employee( id int,name varchar(10
我有一个名为employee的表,有两列,并为其创建了两个函数
插入和更新操作.这两个函数将通过另一个函数调用
名为udf_3()的函数.

我想对第三个函数udf_3()进行异常处理
给我详细说明哪个函数有错误.

– 表:员工

create table employee
(
 id int,name varchar(10)
);

– 功能1:用于插入的udf_1().

create or replace function udf_1()
returns void as
$body$
begin

        insert into employee values(1,'Mak');
end;
$body$
language plpgsql;

– 功能2:udf_2()用于更新.

create or replace function udf_2()
returns void as
$body$
begin

        update employee
        set a_id = 99
        where name = 'Mak';

end;
$body$
language plpgsql;

– 功能3:udf_3()用于调用上述所有功能.

create or replace function udf_3()
returns int as
$body$
begin
    perform udf_1();

    perform udf_2();

    return 0;

    exception 
    when others then
        RAISE INFO 'Error Name:%',SQLERRM;
        RAISE INFO 'Error State:%',SQLSTATE;
        return -1;

end;
$body$
language plpgsql;

– 功能调用:

select * from udf_3();

例外:

INFO:  Error Name:column "a_id" of relation "employee" does not exist
INFO:  Error State:42703

问题:我能够获得异常但是无法从哪个函数中获取异常.

解决方法

根据文件

Within an exception handler,one may also retrieve information about the current exception by using the GET STACKED DIAGNOSTICS command

https://www.postgresql.org/docs/9.5/static/plpgsql-control-structures.html#PLPGSQL-EXCEPTION-DIAGNOSTICS

例:

create or replace function udf_3()
returns int as
$body$
declare
    err_context text;
begin
    perform udf_1();

    perform udf_2();

    return 0;

    exception 
    when others then
        GET STACKED DIAGNOSTICS err_context = PG_EXCEPTION_CONTEXT;
        RAISE INFO 'Error Name:%',SQLSTATE;
        RAISE INFO 'Error Context:%',err_context;
        return -1;

end;
$body$
language plpgsql;

将显示以下内容:

INFO: Error Context:SQL: "SELECT udf_1()"

但这只是错误的文本表示.你的逻辑不应该依赖它.最好使用自定义错误代码来处理异常逻辑(并在函数中引发有意义的异常,以便稍后捕获和处理).

更新:

另一种解决方案是将您的代码分成不同的块,您可以单独捕获异常.在这种情况下,您知道从哪个块引发了异常:

DO $$
BEGIN

    -- Block 1
    BEGIN
        -- any code that might raise an exception
        RAISE EXCEPTION 'Exception 1'; -- for example
    EXCEPTION 
    WHEN others THEN    
        RAISE INFO 'Caught in Block 1';
    END;

    -- Block 2
    BEGIN
        -- any code that might raise an exception
        RAISE EXCEPTION 'Exception 2'; -- for example
    EXCEPTION 
    WHEN others THEN    
        RAISE INFO 'Caught in Block 2';
    END;

END $$

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读