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后,整个函数的操作都会回滚。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。