规格约束
- 触发器函数不支持自治事务。
函数或者存储过程的自治事务块中,静态sql语句不支持变量传递。
--自治事务不支持以下函数的执行,sql中含有变量i。
CREATE OR REPLACE FUNCTION autonomous_easy_2(i int) RETURNS integer
LANGUAGE plpgsql
AS $$
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
START TRANSACTION;
INSERT INTO test1 VALUES (i, 'test');
COMMIT;
RETURN 42;
END;
$$;
--如果想使用参数的传递,请使用动态语句excute进行变量替换,如下例子可以执行。
CREATE OR REPLACE FUNCTION autonomous_easy(i int) RETURNS integer
LANGUAGE plpgsql
AS $$
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
START TRANSACTION;
EXECUTE 'INSERT INTO test1 VALUES (' || i::integer || ', ''test'')';
COMMIT;
RETURN 42;
END;
$$;
自治事务不支持执行嵌套
须知: 在一个包含自治事务的函数中,通过perform、select、call等来显式执行另一个包含自治事务的函数或者存储过程是不被允许的,但是可以在最后return里显式调用另一个包含自治事务的函数或者存储过程。
包含自治事务的函数,不支持参数传递的返回值
--如下例子中的,返回值ret不会进行传递,只会返回null。
create or replace function at_test2(i int) returns text
LANGUAGE plpgsql
as $$
declare
ret text;
pragma autonomous_transaction;
begin
START TRANSACTION;
insert into at_tb2 values(1, 'before s1');
if i > 10 then
rollback;
else
commit;
end if;
select val into ret from at_tb2 where id=1;
return ret;
end;
$$;
包含自治食物的存储过程/函数,不支持exception异常处理。
触发器函数不支持自治事务。