gpt4 book ai didi

Oracle Apex - 引发虚拟列错误

转载 作者:行者123 更新时间:2023-12-02 11:48:22 26 4
gpt4 key购买 nike

我目前正在使用 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 是一个文本字段,在此列属性的“链接”部分中,“目标”的类型为 URL,且 URL 为 &LINK1。我还在 APEX 应用程序中指出 periodical_topics_id 是主键。这些是我所指的链接列的属性:

enter image description here

问题:当我手动将值插入交互式网格的“LINK1”列中的单元格时,会出现错误:

“•Ajax 调用返回服务器错误 ORA-20987:APEX - 执行 DML 命令时处理“定期主题 - 保存交互式网格数据”引发“ORA-01733:此处不允许虚拟列”。如果列基于聚合或 SQL 表达式。将列属性“仅限查询”设置为"is"以从 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 语句,因为某些链接会将用户引导至外部网站,而其他链接会将用户引导至应用程序中的另一个页面。如果没有将 :APP_SESSION 连接到链接的 case 语句,则每当用户单击将他们定向到应用程序中的另一个页面的链接时,他们都会被迫重新登录到应用程序。

有谁知道为什么当 case 语句在查询中时会发生错误,而当 case 语句不在查询中时则不会发生错误?

提前谢谢您。

最佳答案

在我看来,这是一个已知问题,可以追溯到表格形式 (TF)(而交互式网格 (IG) 是其高级版本)。据我所知,您不能/不能使用带有联接或虚构列的查询创建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 输入/更新该列的值。

关于Oracle Apex - 引发虚拟列错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52009100/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com