Postgresql Update函数返回未更新的记录

Postgresql Update函数返回未更新的记录,postgresql,function,Postgresql,Function,我有下面的PostgreSQL函数来更新一组记录,我希望它在更新后返回相同的记录列表。现在它正在返回返回集合中更新标志_read=FALSE之前的记录列表。我知道更新工作得很好,因为在执行函数后查询表时,我可以看到标志_read=TRUE 如何更改函数以返回更新的记录集 创建或替换函数库。将所有通知标记为已读 将set of base.notification返回为$$ 开始 返回查询 将未读通知作为 更新base.notification 设置标志_read=TRUE 其中flag_read=

我有下面的PostgreSQL函数来更新一组记录,我希望它在更新后返回相同的记录列表。现在它正在返回返回集合中更新标志_read=FALSE之前的记录列表。我知道更新工作得很好,因为在执行函数后查询表时,我可以看到标志_read=TRUE

如何更改函数以返回更新的记录集

创建或替换函数库。将所有通知标记为已读 将set of base.notification返回为$$ 开始 返回查询 将未读通知作为 更新base.notification 设置标志_read=TRUE 其中flag_read=FALSE 并通过\u id=base.get\u current\u user\u id创建 返回id 从base.a通知中选择* 其中a.id在SELECT id FROM unread_notifications中; 终止 $$language plpgsql VOLATILE严格安全定义器; 您所需要的只是一个简单的更新..返回*。不必要的WITH和SELECT是导致问题的原因

:

与中的子语句同时执行 和主查询。因此,在使用数据修改时 语句,指定的实际更新顺序 事情的发生是不可预测的。所有语句都以相同的方式执行 快照见第13章,因此他们无法“看到”彼此的影响 在目标表上。这减轻了压力的影响 行更新的实际顺序不可预测,这意味着 返回数据是在用户之间传递更改的唯一方法 与子语句和主查询不同

编辑:添加完整的函数作为示例

创建或替换函数库。将所有通知标记为已读 将set of base.notification返回为$$ 开始 返回查询 更新base.notification 设置标志_read=TRUE 其中flag_read=FALSE 并通过\u id=base.get\u current\u user\u id创建 返回*; 终止 $$language plpgsql VOLATILE严格安全定义器;
@rolland实际上也不需要PL/pgSQL。一个简单的LanguagSQL函数也可以工作