使用开始异常块错误的 Postgresql 插入

Posted

技术标签:

【中文标题】使用开始异常块错误的 Postgresql 插入【英文标题】:Postgres Sql Insertion using Begin Exception Block Error 【发布时间】:2021-07-28 15:39:46 【问题描述】:

我正在使用开始异常块的查询它在插入附近给我语法错误这是我的查询

BEGIN
        INSERT INTO public.role(
        id, "RoleName")
        VALUES (1, 'SomeRole')
        RETURNING id as roleid;
    
EXCEPTION
    RETURNING -1 as roleid
END
    
    select roleid

【问题讨论】:

您不能只在psqlpgadmin 中使用此类代码,它只能在PL/pgSQL 函数或DO 运算符中运行。 postgresql.org/docs/9.4/… 仅供参考,Postgresql 9.4 大约 6 个月后 EOL。见Versions。您可能需要考虑迁移到较新的版本。根据@ИгорьТыра 的评论,这不会改变错误,但它会为您提供一个包含错误和安全修复的版本。 【参考方案1】:

这不是使用 PostgreSql 的方法。您只能使用 CommitBegin

这是你可以遵循的语法

BEGIN;

        INSERT INTO public.role(
        id, "RoleName")
        VALUES (1, 'SomeRole')
        RETURNING id as roleid;
    
COMMIT;

这里的BEGIN块会自动回滚你的交易。您也可以通过这样做返回最后插入的 roleid

【讨论】:

这个答案显示的是纯SQL,与问题中的代码几乎没有关系。话又说回来,这个问题一开始并不是一个问题【参考方案2】:

我曾多次遇到这种情况。我通常会这样做:

    CREATE OR REPLACE FUNCTION test_function() 
    RETURNS INT AS
    $$
    DECLARE
      some_var INT;
    BEGIN
        INSERT INTO public.role(id, RoleName)
        VALUES(1, 'SomeRole') 
        RETURNING public.role.id INTO some_var;
        
        RETURN some_var;
        
         EXCEPTION WHEN OTHERS THEN
         RETURN -1;
    END;
    $$
    LANGUAGE plpgsql;

select * from test_function();

Check the fiddle 看看有无异常会发生什么。 注意:由于某种原因,小提琴中的 $$ 应该用引号代替,因此里面的引号是双引号。

【讨论】:

以上是关于使用开始异常块错误的 Postgresql 插入的主要内容,如果未能解决你的问题,请参考以下文章

如果插入语句给出重复键异常(在表中找到行 id=1)如何更新 JDBC(Postgresql)中的语句

PostgreSQL存储过程-异常错误处理

使用 JDBC 插入 PostgreSQL 时间类型时出错

尝试插入长数组时出现 Postgresql 错误

如何使用 Pscycopg2 将字典插入 Postgresql 表

无法使用 laravel eloquent ORM 插入 PostgreSQL