使用开始异常块错误的 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
【问题讨论】:
您不能只在psql
或pgadmin
中使用此类代码,它只能在PL/pgSQL
函数或DO
运算符中运行。 postgresql.org/docs/9.4/…
仅供参考,Postgresql 9.4 大约 6 个月后 EOL。见Versions。您可能需要考虑迁移到较新的版本。根据@ИгорьТыра 的评论,这不会改变错误,但它会为您提供一个包含错误和安全修复的版本。
【参考方案1】:
这不是使用 PostgreSql 的方法。您只能使用 Commit 来Begin。
这是你可以遵循的语法
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)中的语句