postgresql Postgres一直在抱怨EXCEPTION关键字

5uzkadbs  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(3)|浏览(147)

根据this Postgres文档中的43.6.8. Trapping Errors主题,处理异常的正确语法是:

BEGIN;
-- SQL Statement
EXCEPTION WHEN Others THEN 
    -- Exception Handling Logic
END;

这是当我在pgAdmin中使用这个语法时,它一直抱怨关键字EXCEPTION
我的查询是:

BEGIN;
    INSERT INTO TestTable (id) VALUES(3);
    COMMIT;
    EXCEPTION WHEN Others THEN 
        ROLLBACK;
END;

错误是:

ERROR:  syntax error at or near "EXCEPTION"
LINE 4:  EXCEPTION WHEN Others THEN 
         ^ 

SQL state: 42601
Character: 57

我不明白这个SQL代码可能有什么问题。如果这不是处理异常的正确方法,那么我如何实现类似的东西呢?
更新:这不是Aurora Postgres。我使用的是Standard Postgres。

68bkxrlz

68bkxrlz1#

您引用的是PL/pgSQL文档,但您必须在查询工具中输入SQL。这是不同的语言,所以PL/pgSQL会导致错误。
如果你想使用PL/pgSQL,你必须创建一个函数或过程,或者你可以在SQL的DO语句中使用它。
你的代码还有两个问题:

  • BEGIN后面不能有分号,因此您一定是引用错了文档
  • 不能在带有异常处理程序的块中使用事务管理语句,如COMMIT
zed5wv10

zed5wv102#

你说你正在使用PgAdmin,所以我假设你正在尝试使用查询工具窗口运行此代码?
在这种情况下,您需要将所有内容放置在DO中,如下所示:

do $$
BEGIN
    INSERT INTO testtable (id) VALUES(1);
    INSERT INTO testtable (id) VALUES(2);
    INSERT INTO testtable (id) VALUES(1);
    EXCEPTION 
    WHEN Others THEN 
    RAISE NOTICE 'error occurred';
END; $$

请注意,不需要提交或回滚。如果你尝试这个代码,假设id是主键,你会发现没有插入任何东西。PostgreSQL自动将所有语句视为一个事务,并在异常发生时将它们全部回滚。

neekobn8

neekobn83#

你可以参考here来了解如何在PostgreSQL中处理异常。
下面是伪代码(来自同一个链接),它可能会给予你一个想法:

select version() as postgresql_version
$Body$
declare
begin
    -- statements;
exception
    when condition [or condition...] then
       handle_exception;
   [when others then
       handle_other_exceptions;
   ]
end;
$Body$

相关问题