Oracle Apex - 出现虚拟列错误
Oracle Apex - Virtual Column error raised
我目前在 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)
在数据库的 table 中,periodic_topics_id 列是主键,当使用以下触发器将新行添加到 table 时,它会自动填充:
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 是主键。这些是我所指的 link 列的属性:
问题:当我手动将值插入交互式网格 "LINK1" 列中的单元格时,出现错误:
"•Ajax 调用返回了服务器错误 ORA-20987:APEX - 进程 'Periodic Topics - Save Interactive Grid Data' 在执行 DML 命令时引发 'ORA-01733: virtual column not allowed here'。如果列基于聚合或 SQL 表达式。将列属性 'Query Only' 设置为 Yes 以从 INSERT 和 UPDATE 语句中排除该列。- 请联系您的应用程序管理员。对于 ."
但是,如果我使用相同的查询创建交互式网格但没有 case 语句,那么在交互式网格中添加 link 没有问题。没有错误发生。换句话说,如果我使用以下查询创建交互式网格,当我尝试向交互式网格中的 "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 语句,因为一些 link 会将用户定向到外部网站,而另一些会将用户定向到应用程序中的另一个页面。如果没有将 :APP_SESSION 连接到 link 的 case 语句,则用户在单击将他们定向到应用程序中的另一个页面的 link 时,将被迫重新登录到应用程序。
有谁知道为什么当case语句在查询中时会出现错误,而当case语句不在查询中时却不会?
提前致谢。
在我看来,这是一个已知问题,可以追溯到表格形式 (TF)(而交互式网格 (IG) 是其 高级 版本)。据我所知,您不能/不能使用带有连接的查询或 fabricated 列创建 TF/IG - 您使用 CASE
.为什么?因为 Apex 很难知道如何操作这样的数据。
联接通常用于 Scott 的 EMP table 等情况,当您想要显示 DEPTNO 以及部门名称 (DNAME) 时,但它存储在 DEPT table 中。加入是一个自然的选择,但它行不通。解决方法是在函数里面创建returns这样的值。而且,当然,它不能可输入。
同样,在您的情况下,您实际上 可以 使用 CASE,但您必须将其设置为 "query only"(按照建议)并将其用于 展示用途。然后你必须有 "original" LINK (数据库)列,这将是可输入的。
基本上,布局应该是这样的:
PERIODIC_TOPICS_ID FILTER TOPIC LINK LINK_DESCRIPTION
------------------ ------ ----- ---- -------------------------
<------- enterable columns ---------> <- your CASE construct ->
用户将单击 LINK_DESCRIPTION 列,这会将他们带到 URL,而您将使用 LINK 来 enter/update 该列的值。
我目前在 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)
在数据库的 table 中,periodic_topics_id 列是主键,当使用以下触发器将新行添加到 table 时,它会自动填充:
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 是主键。这些是我所指的 link 列的属性:
问题:当我手动将值插入交互式网格 "LINK1" 列中的单元格时,出现错误:
"•Ajax 调用返回了服务器错误 ORA-20987:APEX - 进程 'Periodic Topics - Save Interactive Grid Data' 在执行 DML 命令时引发 'ORA-01733: virtual column not allowed here'。如果列基于聚合或 SQL 表达式。将列属性 'Query Only' 设置为 Yes 以从 INSERT 和 UPDATE 语句中排除该列。- 请联系您的应用程序管理员。对于 ."
但是,如果我使用相同的查询创建交互式网格但没有 case 语句,那么在交互式网格中添加 link 没有问题。没有错误发生。换句话说,如果我使用以下查询创建交互式网格,当我尝试向交互式网格中的 "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 语句,因为一些 link 会将用户定向到外部网站,而另一些会将用户定向到应用程序中的另一个页面。如果没有将 :APP_SESSION 连接到 link 的 case 语句,则用户在单击将他们定向到应用程序中的另一个页面的 link 时,将被迫重新登录到应用程序。
有谁知道为什么当case语句在查询中时会出现错误,而当case语句不在查询中时却不会?
提前致谢。
在我看来,这是一个已知问题,可以追溯到表格形式 (TF)(而交互式网格 (IG) 是其 高级 版本)。据我所知,您不能/不能使用带有连接的查询或 fabricated 列创建 TF/IG - 您使用 CASE
.为什么?因为 Apex 很难知道如何操作这样的数据。
联接通常用于 Scott 的 EMP table 等情况,当您想要显示 DEPTNO 以及部门名称 (DNAME) 时,但它存储在 DEPT table 中。加入是一个自然的选择,但它行不通。解决方法是在函数里面创建returns这样的值。而且,当然,它不能可输入。
同样,在您的情况下,您实际上 可以 使用 CASE,但您必须将其设置为 "query only"(按照建议)并将其用于 展示用途。然后你必须有 "original" LINK (数据库)列,这将是可输入的。
基本上,布局应该是这样的:
PERIODIC_TOPICS_ID FILTER TOPIC LINK LINK_DESCRIPTION
------------------ ------ ----- ---- -------------------------
<------- enterable columns ---------> <- your CASE construct ->
用户将单击 LINK_DESCRIPTION 列,这会将他们带到 URL,而您将使用 LINK 来 enter/update 该列的值。