0

我为表创建了一个 APEX 应用程序,以允许用户访问表中的更新记录。我使用了交互式网格并在其中添加了编辑选项。我有一个标识列 SEQ_ID,它默认用于获取数据库中的下一个值。因此,当我在 APEX 中编辑任何列时,我都会遇到错误。

ORA-32796: 无法更新生成的始终标识列。

因此,在交互式网格的处理选项中,我将其更改为 PL/SQL 代码并添加了一条更新语句,以便我可以从 APEX 中排除 SEQ_ID 列更新,而不是区域源。这解决了上述 ORA 错误。

但是我的一个表有 220 列,应该在 APEX 中进行编辑(我知道这听起来很奇怪,但是是的)所以当我写一个更新语句时它给了我一个错误,如下所示。

值太长了 4000 个字符。

谁能帮我解决这个问题。

更新语句很简单,如下所示

更新表

设置 Col1 = :Col1

,Col2 = :Col2 .... ... ...

其中 SEQ_ID = :SEQ_ID

4

2 回答 2

0

解决方案1:

恢复使用默认的 IG 更新/插入并右键单击 IDENTITY 列并单击删除:

示例删除列

解决方案2:

创建一个过程并将您的更新/插入代码移动到该过程中。您应该能够访问过程中的 APEX_COLLECTIONS,因为它们是会话的一部分。

于 2020-10-02T05:19:50.793 回答
0

ORA-32796 的解决方案是更改列 SEQ_ID 的设置。在该列的“源”部分中,将“仅查询”和“主键”设置为 ON。这将确保“交互式网格 - 自动行处理”过程不会在 DML 语句中包含该列,并且不会发生错误。然后您将能够使用交互式网格流程,而不是编写您自己的代码。

交互式网格(与此相关的任何顶点表单区域)非常适合更新用户输入的数据。数据库可以更好地处理诸如序列、审计列(updated_by、created_by、...)之类的列。最佳做法是通过示例表 DEPARTMENTS 上的触发器来执行此操作:

create or replace trigger departments_biu
    before insert or update 
    on departments
    for each row
begin
    if inserting then
        :new.created := sysdate;
        :new.created_by := nvl(sys_context('APEX$SESSION','APP_USER'),user);
    end if;
    :new.updated := sysdate;
    :new.updated_by := nvl(sys_context('APEX$SESSION','APP_USER'),user);
end departments_biu;
/
于 2020-10-02T12:32:00.340 回答