相关疑难解决方法(0)

PostgreSQL:在plpgsql函数中回滚事务?

来自MS SQL世界,我倾向于大量使用存储过程.我目前正在编写一个应用程序使用了很多PostgreSQL plpgsql函数.我想做的是回滚特定函数中包含的所有INSERTS/UPDATES如果我在其中的任何一点得到异常.

我最初的印象是每个函数都包含在它自己的事务中,并且异常会自动回滚所有内容.但是,情况似乎并非如此.我想知道我是否应该将保存点与异常处理结合使用?但我并不真正了解事务和保存点之间的区别,以了解这是否是最好的方法.有什么建议吗?

CREATE OR REPLACE FUNCTION do_something(
         _an_input_var int
                ) RETURNS bool AS $$
        DECLARE
                _a_variable int;
        BEGIN
                INSERT INTO tableA (col1, col2, col3)
                        VALUES (0, 1, 2);

                INSERT INTO tableB (col1, col2, col3)
                        VALUES (0, 1, 'whoops! not an integer');

                -- The exception will cause the function to bomb, but the values 
                -- inserted into "tableA" are not rolled back.    

                RETURN True;
END; $$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

postgresql transactions plpgsql

10
推荐指数
1
解决办法
2万
查看次数

PostgreSQL与Oracle:PL/pgSQL的"编译时"检查

执行摘要: PostgreSQL很棒,但由于它推迟了许多PL/pgSQL代码检查直到运行时间,因此我们面临着许多工作中的问题.有没有办法让它在这方面更像甲骨文的PL/SQL

例如...

尝试在任何Oracle DB中执行此操作:

create function foo return number as
begin
  select a from dual;
  return a;
end;
Run Code Online (Sandbox Code Playgroud)

Oracle将立即(即在编译时!)响应:

[Error] ORA-00904: invalid identifier
Run Code Online (Sandbox Code Playgroud)

现在尝试PostgreSQL中语义相同的东西:

CREATE OR REPLACE FUNCTION public.foo ()
    RETURNS integer AS
$body$
    BEGIN
        select a;
        return a;
    END;
$body$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

你会看到它 - 不幸的是! - 执行正常...没有报告错误.

但是,当您尝试调用此函数(即在运行时)时,您将获得:

ERROR:  column "a" does not exist
LINE 1: select a
Run Code Online (Sandbox Code Playgroud)

有没有办法强制PostgreSQL在函数定义时执行语法分析和检查 - 而不是在运行时?我们有很多传统的PL/SQL代码在工作,我们正在移植到PostgreSQL - 但缺乏编译时检查是非常痛苦的,迫使我们做手工工作 - 即编写代码来测试所有函数中的所有代码路径/程序 - 在Oracle中以其他方式自动化.

oracle postgresql plsql plpgsql

7
推荐指数
2
解决办法
2177
查看次数

标签 统计

plpgsql ×2

postgresql ×2

oracle ×1

plsql ×1

transactions ×1