我们的应用程序中有一个功能,可以从表中查询用户需要查看的所有通知。基本上,它有点像电子邮件在网站上的显示方式。右上角有一个图标,显示有关您有多少个新通知的警报,单击该图标会列出您有的所有通知,将已读和未读通知分开。
我们从一个表中查询所有通知。困境是我们如何将标记记录实现为未读或已读。最初的计划是为每个记录添加一个标志,以指示是否已读取。因此,我们进行查询,遍历结果集,并将所有那些为“ N”的记录的读取标志设置为“ Y”。从性能角度来看,遍历结果集中的每个记录并更新读取标志似乎有些错误。有一个更好的方法吗? oracle db中是否有功能可以解决此问题?不能在前端处理
我们正在使用Oracle 12c
答案 0 :(得分:1)
如果您担心效果,应该不要循环显示结果集,如果可以避免的话。 SQL是一种基于集合的语言,因此可以对集合(而不是记录)进行操作。认真地,去读史蒂芬·费尔斯坦。您没有给我们任何桌子或任何东西,但是您想要做类似的事情:
UPDATE mytable
SET read_flag = 'Y'
WHERE read_flag = 'N'
AND ...
这将更新所有未读内容以一次读取。如果您需要知道有多少更新,Oracle在运行后可以立即查看SQL%ROWCOUNT
。
但是,在您不得不担心性能之前,请不要担心性能。如果没有证据,不要以为这将是一个性能问题。老实说,对于我想像的这张表来说,将几行标记为已读不会成为性能问题。
答案 1 :(得分:0)
您可以按照此处所述-https://oracle-base.com/articles/misc/dml-returning-into-clause#collections
链接的修改示例:
DECLARE
TYPE t_tab IS TABLE OF t1.notification_text%TYPE;
l_tab t_tab;
BEGIN
UPDATE my_table
SET is_read = 'Y'
RETURNING notification_text BULK COLLECT INTO l_tab;
-- Do stuff with the data in your collection. Return it or whatever.
END;
/