Postgreの関数にトランザクションがあるかどうかをテストします

1496 ワード

1、背景


テストpostgreのfunctionはraiseのexceptionの後、テーブルに書き込まれた内容が戻ってくるかどうかをテストします.

2、コード


2.1まずfun 1を作成する

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 fun 2の作成

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を放出すると、関数全体の操作がロールバックされます.