Oracle Apex-出现虚拟列错误

时间:2018-08-24 17:16:28

标签: oracle oracle-apex oracle-apex-5 oracle-apex-5.1

我目前正在使用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是主键。这些是我指的链接列的属性:

enter image description here

问题:当我在交互式网格的“ 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语句不在查询中时会发生错误吗?

谢谢。

1 个答案:

答案 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输入/更新该列的值。