我有一个使用Oracle Forms创建的接口。它有一个base table block
,其中有一个字段(即col3
“ 与表列的名称同”同名)。
表单具有其他两个数字类型的字段col1
和col2
,这些字段也是具有上述col3
列的同一表的成员。
我将col3
转换为虚拟列,作为表定义(col1
)中列col2
和col3 number generated always as (nvl(col1,0)+nvl(col2,0)) virtual
的总和
当我尝试在基表中提交更改时,它会显示错误消息
ORA-54013 :不允许在虚拟列上执行INSERT操作
我知道将DML应用于虚拟列是没有意义的,但是即使我更改了col3
字段的
Query Only
属性从No
到Yes
Update Allowed
属性从Yes
到No
Insert Allowed
属性从Yes
到No
我收到相同的错误消息。我不想编写显式的DML语句,因为该表单还有很多其他字段,它们也应该在这些语句中列出。
您是否知道如何在不放弃base table block
结构的情况下克服此问题? (我使用的是Fusion Middleware 11g版本)
答案 0 :(得分:1)
由于您对该列所做的一切都是 query ,因此如何将其设置为非数据库列?不过,这将需要编写一个POST-QUERY
触发器-否则,执行查询后您将看不到它的值。
:block.col3 := :block.col1 + :block.col2;
在WHEN-VALIDATE-ITEM
和:block.col1
项上将相同的代码放入:block.col2
触发器中,以便在插入/更新值时计算结果。
或者,创建一个过程(在表单内),将上面的代码放入其中,然后从这些触发器中调用该过程-从长远来看,这可能是一个更好的选择d只需要在程序中维护代码更改。