1、背景

测试postgre的function在raise一个exception后,已经写入到表中的内容是否会回退回来。

2、代码

2.1 首先创建fun1

DROP FUNCTION if EXISTS fun_test1();
CREATE OR REPLACE FUNCTION fun_test1()
    RETURNS Boolean
AS $$
DECLARE
    i integer;
BEGIN
    -- 写一条数据到数据表中
    INSERT INTO temp_1 VALUES ('7800301210000003245814');

    RETURN TRUE;
end;
$$ LANGUAGE plpgsql;

2.2创建fun2

DROP FUNCTION if EXISTS fun_test2();
CREATE OR REPLACE FUNCTION fun_test2()
    RETURNS Boolean
AS $$
DECLARE
    i integer;
BEGIN

    RAISE EXCEPTION 'test_fun2的exception';

    RETURN TRUE;
end;
$$ LANGUAGE plpgsql;

2.3创建测试fun

DROP FUNCTION if EXISTS fun_test(para_days integer);
CREATE OR REPLACE FUNCTION fun_test(para_days integer)
    RETURNS Boolean
AS $$
DECLARE
    r1 BOOLEAN;
    r2 BOOLEAN;
BEGIN

    SELECT fun_test1() INTO r1;
    SELECT fun_test2() INTO r2;

    RAISE NOTICE '1的执行结果: %',r1;
    RAISE NOTICE '2的执行结果: %',r2;

    RETURN TRUE;

EXCEPTION
    WHEN OTHERS THEN
        RAISE NOTICE '错误信息:%',SQLERRM;
        RETURN FALSE;
end;
$$ LANGUAGE plpgsql;

2.4创建测试用的表

create table temp_1(account_no varchar(22));

3、执行测试

(1) select fun_test(2);
(2) select * from temp_1;
可以看到temp_1中没有插入数据,说明postgre的函数自带事务。当函数体内的任何一个操作或子函数抛出exception后,整个函数的操作都会回滚。


SHIYIBODEC
26 声望2 粉丝