gpt4 book ai didi

postgresql - PLSQL 函数如何返回 UPDATED...RETURNING 查询的结果?

转载 作者:行者123 更新时间:2023-11-29 12:42:17 25 4
gpt4 key购买 nike

我有一个函数需要:

  1. 调用另一个函数
  2. 然后返回更新语句的结果
  3. 不会在原子性上失败

函数看起来像这样:

CREATE OR REPLACE FUNCTION bal_update_balances(_acct Accounts, _amount INT, _currency INT)
RETURNS SETOF Balances AS $$
DECLARE
-- rv SETOF Balances;
BEGIN
-- STEP 0: initialize balances (make sure they are present in the DB)
PERFORM bal_initialize_balances(_acct, _currency);

-- STEP 1: update & return balances
RETURN QUERY (
UPDATE Balances
SET amount = amount + _amount,
updated_at = now()
WHERE id IN (SELECT id
FROM bal_get_balances(_acct, _currency))
RETURNING *
);
END;
$$ LANGUAGE plpgsql;

到目前为止,我已经失败了:

  1. 如果我尝试将 UPDATE..RETURNING 的输出放入一个变量 (rv),然后返回该变量:
    1. 变量声明失败(rv SETOF Balances 失败,类型名称“SETOF Balances”无效)
    2. 然后如何将UPDATE..RETURNING的输出放入rv也是一个很好的问题
  2. 如果我尝试执行RETURN QUERY,则它会失败,并在“UPDATE”处或附近出现语法错误
  3. 如果我尝试将更新语句包装到选择语句中(SELECT * FROM (UPDATE ... RETURNING)),那么编译器会提示 SET 部分嵌套的更新语句(“SET”处或附近的语法错误)
  4. 如果我重写整个事情以迭代 bal_get_balances(_acct, _currency)) 输出(a SETOF Balances)并执行 RETURN NEXT那么问题 1-2 又出现了,如何将 UPDATE..RETURNING 的输出放入 psql 变量中?

一般的想法是,我可以从交易中的主要软件(Ruby,但不相关)运行这个功能作为某种模拟,然后根据主要应用程序中的某种复杂业务逻辑决定是否去完成交易,或者根据余额的确切状态将其丢弃 - 这是迄今为止我想到的将复杂且非常动态的应用程序业务逻辑与 ACID 要求相结合的唯一方法。

最佳答案

在循环中使用record类型的变量:

declare
r record;
begin
-- ...
for r in
update balances
set updated_at = now()
-- ...
returning *
loop
return next r;
end loop;

关于postgresql - PLSQL 函数如何返回 UPDATED...RETURNING 查询的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44066174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com