【发布时间】:2012-11-30 15:14:33
【问题描述】:
这已被多次询问here 和here,但没有一个答案适合我的情况,因为我不想在 PL/PgSQL 函数中执行我的更新语句并使用GET DIAGNOSTICS integer_var = ROW_COUNT。
我必须在原始 SQL 中执行此操作。
例如,在 MS SQL SERVER 中,我们有 @@ROWCOUNT 可以像下面这样使用:
UPDATE <target_table>
SET Proprerty0 = Value0
WHERE <predicate>;
SELECT <computed_value_columns>
FROM <target>
WHERE @@ROWCOUNT > 0;
在数据库的一次往返中,我知道更新是否成功并返回计算值。
可以用什么来代替 '@@ROWCOUNT' ? 有人可以确认目前这实际上是不可能的吗?
提前致谢。
EDIT 1:我确认我需要使用原始 SQL(我在原始描述中写了“raw plpgsql”)。
为了使我的问题更清楚,请考虑更新语句仅影响一行并考虑乐观并发:
客户一开始做了
SELECT声明。他构建了 UPDATE 并知道哪些数据库计算列将包含在 SELECT 子句中。除其他外,谓词包括每次更新行时计算的时间戳。
因此,如果我们返回 1 行,那么一切正常。如果没有返回任何行,那么我们知道之前有更新,客户端可能需要在再次尝试更新子句之前刷新数据。这就是为什么我们需要在返回计算列之前知道有多少行受更新语句影响。如果更新失败,则不应返回任何行。
【问题讨论】:
-
请始终在问题中提及您的 PostgreSQL 版本。
-
所以你不想想在 PL/pgSQL 中但在 SQL 中做。否则你可以使用
GET DIAGNOSTICS -
@CraigRinger : 查看相应的标签。
-
重新版本:我的错误。我忘记了人们使用特定于版本的标签只是为了说“这是我正在使用的版本”。
-
我已经根据您的编辑详细说明了我的答案。看起来
UPDATE ... RETURNING可以满足您的需求。
标签: postgresql plpgsql optimistic-concurrency postgresql-9.2