如何解决 Oracle Apex 中的“无法使用 DISTINCT、GROUP BY 等从视图中选择 FOR UPDATE”错误?

Posted

技术标签:

【中文标题】如何解决 Oracle Apex 中的“无法使用 DISTINCT、GROUP BY 等从视图中选择 FOR UPDATE”错误?【英文标题】:How to resolve "cannot select FOR UPDATE from view with DISTINCT, GROUP BY, etc" error in Oracle Apex? 【发布时间】:2020-05-16 09:22:53 【问题描述】:

我的 Oracle Apex 应用程序中有一个事件页面,其中数据源设置为通过连接多个表创建的视图。因此,当用户尝试更新事件时,它会失败,因为系统尝试更新视图而不是实际表。这就是为什么我创建了一个更新实际表而不是视图的触发器函数。但我仍然收到错误消息。

这是触发器的脚本:

CREATE OR REPLACE TRIGGER t_update_event
INSTEAD OF UPDATE ON v_event
BEGIN 
    UPDATE Event
    SET start_date = :new.start_date,
        end_date = :new.end_date,
        start_time = :new.start_time,
        end_time = :new.end_time,
        description = :new.description
    WHERE event_id = :old.event_id;
END;
/
ALTER TRIGGER t_update_event ENABLE
/

我该如何解决这个问题?我的代码有问题吗?

如果这有任何帮助,以下是视图的脚本。

CREATE OR REPLACE FORCE VIEW "V_EVENT" ("EVENT_ID", "EVENT_NAME", "START_DATE", "END_DATE", "START_TIME", "END_TIME", "DESCRIPTION", "FROM_COLLEGE", "FROM_COMMUNITY", "CLUB_NAME") AS 
  SELECT event."EVENT_ID"
  ,event."EVENT_NAME"
  ,event."START_DATE"
  ,event."END_DATE"
  ,event."START_TIME"
  ,event."END_TIME"
  ,event."DESCRIPTION"
  ,CASE WHEN event."FROM_COLLEGE" = 0 THEN 'No'
  WHEN event."FROM_COLLEGE" = 1 THEN 'Yes'
  END AS "From College"
  ,CASE WHEN event."FROM_COMMUNITY" = 0 THEN 'No'
  WHEN event."FROM_COMMUNITY" = 1 THEN 'Yes'
  END AS "From Community"
  ,LISTAGG(club_name, ',') WITHIN GROUP ( ORDER BY club_name) AS clubs
FROM event
LEFT JOIN (club_event INNER JOIN club ON club_event.club_id = club.club_id)
ON event.event_id = club_event.event_id
GROUP BY event."EVENT_ID"
     ,event."EVENT_NAME"
     ,event."START_DATE"
     ,event."END_DATE"
     ,event."START_TIME"
     ,event."END_TIME"
     ,event."DESCRIPTION"
     ,event."FROM_COLLEGE"
     ,event."FROM_COMMUNITY"
/

谢谢。

【问题讨论】:

在这种更复杂的情况下,您可以考虑用您自己的自定义 PLSQL 代码替换标准 DML 流程,直接保存到基础表中。这样,您也不需要触发器。 【参考方案1】:

这是一个可能适用于您的情况的建议。将视图定义为:

select e.*,  -- you can list out the columns here
       (select LISTAGG(c.club_name, ',') WITHIN GROUP (ORDER BY c.club_name) 
        from club_event ce join
             club c
             on ce.club_id = c.club_id
        where e.event_id = ce.event_id
       ) as clubs
from events;

这消除了外部聚合,这可能会有所帮助。

也就是说,问题可能不是instead of 触发器本身。这可能是它被调用的方式。对视图的简单更新应该可以工作。尝试锁定行以进行更新 - 错误消息表明 - 不会。

【讨论】:

以上是关于如何解决 Oracle Apex 中的“无法使用 DISTINCT、GROUP BY 等从视图中选择 FOR UPDATE”错误?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 ORACLE APEX 删除交互式报表中的行

Oracle APEX 修改工作区域用户名后程序无法使用

我需要从Oracle Apex连接到DB2 AS / 400数据库。

如何将具有自动完成功能的文本字段限制为列表中的项目 - Oracle Apex 5

如何在动态操作中单击按钮时调用Oracle APEX中的javascript函数?

如何以编程方式将用户添加到 Oracle APEX 4.x 中的访问控制列表?