PostgreSQL 9.5:异常处理

PostgreSQL 9.5:异常处理,第1张

概述我有一个名为employee的表,有两列,并为其创建了两个函数 插入和更新 *** 作.这两个函数将通过另一个函数调用 名为udf_3()的函数. 我想对第三个函数udf_3()进行异常处理 给我详细说明哪个函数有错误. – 表:员工 create table employee( id int, name varchar(10)); – 功能1:用于插入的udf_1(). create or re 我有一个名为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 existINFO:  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 $$
总结

以上是内存溢出为你收集整理的PostgreSQL 9.5:异常处理全部内容,希望文章能够帮你解决PostgreSQL 9.5:异常处理所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1160859.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存