如何解决 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连接到DB2 AS / 400数据库。
如何将具有自动完成功能的文本字段限制为列表中的项目 - Oracle Apex 5