1

我有一个使用 Oracle Forms 创建的界面。它有base table block一个字段(即col3与派生自”的表的列具有相同的名称)。

表单还有两个其他字段col1,并且col2是数字类型,这些字段也是具有col3上述列的同一个表的成员。

我转换col3为虚拟列作为列的总和col1col2在表的定义中(col3 number generated always as (nvl(col1,0)+nvl(col2,0)) virtual

当我尝试在基表中提交更改时,它会抛出错误消息

ORA-54013: 不允许对虚拟列执行 INSERT 操作

我知道将 DML 应用于虚拟列没有意义,但即使我改变了该col3字段的

  • Query Only财产从NoYes

  • Update Allowed财产从YesNo

  • Insert Allowed财产从YesNo

我收到相同的错误消息。我不想写显式的 DML 语句,因为表单有很多其他字段,它们也应该列在这些语句中。

你知道如何在不放弃base table block结构的情况下克服这个问题吗?(我使用的是 Fusion Middleware 11g 版本

4

1 回答 1

1

由于您对该列所做的一切都是查询,因此将其设置为非数据库列怎么样?但是,它需要编写一个POST-QUERY触发器 - 否则在执行查询后您将看不到它的值。

:block.col3 := :block.col1 + :block.col2;

将相同的代码放入和项的WHEN-VALIDATE-ITEM触发器中,以便在插入/更新值时计算结果。:block.col1:block.col2

或者,创建一个过程(在表单中),将上述代码放入其中,然后从这些触发器中调用该过程 - 从长远来看,这可能是一个更好的选择,因为您必须只在过程中维护代码更改.

于 2019-01-13T21:12:19.027 回答