当前位置: 首页 > 知识库问答 >
问题:

Postgresql函数锁定表,更新值并返回行

楚瑞
2023-03-14

对于我的Hi/Lo实现,我需要一个函数来获取独占表锁、更新值并选择一行。我想出了以下代码:

CREATE OR REPLACE FUNCTION bb_next_hi(tbl varchar(35))  
RETURNS setof record AS
$$ 
    LOCK TABLE hilo IN ACCESS EXCLUSIVE MODE;
    OPEN ref FOR SELECT hi as "Hi", lo as "Lo", "table" as "Table" FROM hilo WHERE "table" = $1;
    UPDATE hilo SET hi = hi + 1 WHERE "table" = $1
    RETURN ref;

$$ LANGUAGE plpgsql;

但是,在调用该函数时,它返回的不是一行,而是一列,内容类似于“未命名门户3”。我想我应该迭代返回的ref(但如何)?

我可以使用的另一种方法是使用UPDATE RETURNING语句,但是我不确定在这种情况下是否会出现竞争情况。任何帮助都将不胜感激。谢谢

共有2个答案

张森
2023-03-14

您正在使用一个< code>cursor变量(您没有声明该变量,并且还缺少一些其他PL/pgSQL必需的元素),并且您返回了该变量。光标引用实际上被称为“入口”,这解释了您的输出。更好的方法是:

CREATE OR REPLACE FUNCTION bb_next_hi(tbl varchar(35))  
RETURNS TABLE ("Hi" int, "Lo" int, "Table" varchar(35)) AS $$
BEGIN
    LOCK TABLE hilo IN ACCESS EXCLUSIVE MODE;
    RETURN QUERY SELECT hi, lo, $1 FROM hilo WHERE "table" = $1;
    UPDATE hilo SET hi = hi + 1 WHERE "table" = $1;
    RETURN;
END;
$$ LANGUAGE plpgsql STRICT;

但你真的需要桌子上的独占锁吗?获得一致的表快照的侵入性要小得多。

墨翔宇
2023-03-14

对我来说,这似乎简单得多:

CREATE OR REPLACE FUNCTION bb_next_hi(tbl varchar(35))  
RETURNS setof record AS
$$ 
BEGIN
    LOCK TABLE hilo IN ACCESS EXCLUSIVE MODE;
    RETURN QUERY UPDATE hilo SET hi = hi + 1 WHERE "table" = $1
        RETURNING hi as "Hi", lo as "Lo", "table" as "Table";
END;
$$ LANGUAGE plpgsql;

我通常也定义< code >返回表(col1 varchar,col2 varchar...)而不是< code >返回记录集。

 类似资料:
  • 问题内容: 我想在PostgreSQL上设置一个返回表的函数。这是该函数的源代码: 调用该函数仅返回一列,并用’,’分隔值: 我期望有不同的列(在函数的开头为表指定的每个值一个),而不仅仅是所有值的列。有谁知道为什么会这样,我该如何解决? 谢谢蒂莫 问题答案: 使用 代替 以获得表格的结果。 (像对待表一样处理该函数。)

  • 尝试使用PostgreSQL 9.2在表上运行这样的更新语句: 我们需要能够在 ~10M 行表上运行它,而不是让它锁定表(因此在更新运行时仍然可以进行正常操作)。我相信使用游标可能是正确的解决方案,但我真的不知道它是否是正确的,或者我应该如何使用游标实现它。 我想出了这个光标代码,我认为这可能很好。 编辑:添加光标功能

  • 客户表中的余额分为:储值余额和盈利余额 要求下单时订单金额优先从储值余额中扣除,其次盈利余额扣除 扣除储值余额,如返回的balance小于0为待扣除金额,说明还需要扣除盈利余额: <update id="deductBalance" parameterType="com.pay.business.domain.CustomDO" > <!-- BEFORE:更新语句执行前执行selectKe

  • 我在使用PostgreSQL 9.3。我是唯一一个处理数据库的人,我的代码按顺序运行单元测试的查询。 大多数情况下,以下更新查询运行正常,但有时会锁定PostgreSQL server。然后,查询似乎永远不会结束,而通常只需要3秒钟。我必须确定查询在单元测试上下文中运行,即数据完全相同,而锁是否发生。代码是唯一更新数据的进程。 我知道在对自更新表使用更新查询时,PostgreSQL可能存在锁问题。

  • 问题内容: 我发现这篇文章: http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions 我正在尝试以它为我的功能的示例。我正在从不同的表中选择不同的列,并试图返回一组记录。 这是我的代码: 当我尝试编译此代码时,出现错误,提示“ widgetdetails”类型不存在。与Wiki

  • 在rust中,任何函数都有返回类型,当函数返回时,会返回一个该类型的值。我们先来看看main函数: fn main() { //statements } 之前有说过,函数的返回值类型是在参数列表后,加上箭头和类型来指定的。不过,一般我们看到的main函数的定义并没有这么做。这是因为main函数的返回值是(),在rust中,当一个函数返回()时,可以省略。main函数的完整形式如下: