规格约束

  • 触发器函数不支持自治事务。
  • 函数或者存储过程的自治事务块中,静态sql语句不支持变量传递。

    1. --自治事务不支持以下函数的执行,sql中含有变量i
    2. CREATE OR REPLACE FUNCTION autonomous_easy_2(i int) RETURNS integer
    3. LANGUAGE plpgsql
    4. AS $$
    5. DECLARE
    6. PRAGMA AUTONOMOUS_TRANSACTION;
    7. BEGIN
    8. START TRANSACTION;
    9. INSERT INTO test1 VALUES (i, 'test');
    10. COMMIT;
    11. RETURN 42;
    12. END;
    13. $$;
    14. --如果想使用参数的传递,请使用动态语句excute进行变量替换,如下例子可以执行。
    15. CREATE OR REPLACE FUNCTION autonomous_easy(i int) RETURNS integer
    16. LANGUAGE plpgsql
    17. AS $$
    18. DECLARE
    19. PRAGMA AUTONOMOUS_TRANSACTION;
    20. BEGIN
    21. START TRANSACTION;
    22. EXECUTE 'INSERT INTO test1 VALUES (' || i::integer || ', ''test'')';
    23. COMMIT;
    24. RETURN 42;
    25. END;
    26. $$;
  • 自治事务不支持执行嵌套

    规格约束 - 图1 须知: 在一个包含自治事务的函数中,通过perform、select、call等来显式执行另一个包含自治事务的函数或者存储过程是不被允许的,但是可以在最后return里显式调用另一个包含自治事务的函数或者存储过程。

  • 包含自治事务的函数,不支持参数传递的返回值

    1. --如下例子中的,返回值ret不会进行传递,只会返回null
    2. create or replace function at_test2(i int) returns text
    3. LANGUAGE plpgsql
    4. as $$
    5. declare
    6. ret text;
    7. pragma autonomous_transaction;
    8. begin
    9. START TRANSACTION;
    10. insert into at_tb2 values(1, 'before s1');
    11. if i > 10 then
    12. rollback;
    13. else
    14. commit;
    15. end if;
    16. select val into ret from at_tb2 where id=1;
    17. return ret;
    18. end;
    19. $$;
  • 包含自治食物的存储过程/函数,不支持exception异常处理。

  • 触发器函数不支持自治事务。