我目前正在使用Oracle Application Express 18.1.0.00.45,但遇到了我不理解的错误。
我使用以下查询创建了一个交互式网格:
select periodic_topics_id, filter, topic,
CASE
WHEN LINK1 like '%116%' then LINK1||:APP_SESSION
ELSE LINK1
END AS LINK1
From periodic_topics
where meeting like :P31_MEETING_DESC
and
(nvl(:P31_FILTER,'0') = '0' or instr(:P31_FILTER||':',filter||':') > 0)
在数据库表中,periodic_topics_id列是主键,当使用以下触发器向表中添加新行时,它将自动填充:
create or replace TRIGGER periodic_topics_trigger
BEFORE INSERT ON periodic_topics
FOR EACH ROW
BEGIN
:new.periodic_topics_id := periodic_topics_seq.nextval;
END;
在APEX应用程序中,link1是一个文本字段,在此列的属性的“ Link”部分中,“ Target”是URL类型,而URL是&LINK1。 我还在APEX应用程序中指出,periodic_topics_id是主键。这些是我指的链接列的属性:
问题:当我在交互式网格的“ LINK1”列中的一个单元格中手动插入一个值时,出现错误,提示:
“••Ajax调用返回了服务器错误ORA-20987:执行DML命令时,APEX-处理“定期主题-保存交互式网格数据”时引发“ ORA-01733:此处不允许使用虚拟列”。列基于聚集或SQL表达式。将列属性“仅查询”设置为“是”,以将列从INSERT和UPDATE语句中排除。-请与您的应用程序管理员联系。”
但是,如果我使用相同的查询但没有case语句创建交互式网格,那么在交互式网格中添加链接没有问题。没有错误发生。换句话说,如果我使用以下查询创建交互式网格,则尝试将值添加到交互式网格的“ Link1”列中时不会发生错误:
select periodic_topics_id, filter, topic, link1
From periodic_topics
where meeting like :P31_MEETING_DESC
and
(nvl(:P31_FILTER,'0') = '0' or instr(:P31_FILTER||':',filter||':') > 0)
仅供参考,我需要查询以包含case语句,因为某些链接会将用户定向到外部网站,而其他链接会将用户定向到应用程序中的另一个页面。如果没有case语句将:APP_SESSION连接到该链接,则只要用户单击将其定向到应用程序另一页面的链接,就被迫重新登录该应用程序。
有人知道为什么当case语句在查询中而不是在case语句不在查询中时会发生错误吗?
谢谢。
答案 0 :(得分:3)
我的看法是,这是一个已知问题,其历史可以追溯到表格形式(TF)(而交互式网格(IG)是其高级版本)。据我所知,您无法/无法使用带有联接或 fabricated 列的查询创建TF / IG-您使用CASE
创建的查询。为什么?因为Apex很难知道如何处理此类数据。
联接通常用于诸如Scott的EMP表之类的情况,当您要显示DEPTNO以及部门名称(DNAME)时,但是将其存储在DEPT表中。加入是自然的选择,但不起作用。解决方案是创建一个返回此类值的函数。而且,当然,它不可能很有趣。
类似地,在您的情况下,您实际上可以使用CASE,但是您必须将其设置为“仅查询”(如建议的那样),并用于显示目的。然后,您必须具有可输入的“原始” LINK(数据库)列。
基本上,布局看起来像这样:
PERIODIC_TOPICS_ID FILTER TOPIC LINK LINK_DESCRIPTION
------------------ ------ ----- ---- -------------------------
<------- enterable columns ---------> <- your CASE construct ->
用户将单击LINK_DESCRIPTION列,该链接会将其带到URL,而您将使用LINK输入/更新该列的值。