Oracle Apex-使用而不是触发器更新视图

Oracle Apex-使用而不是触发器更新视图,oracle,triggers,views,oracle-apex,Oracle,Triggers,Views,Oracle Apex,这里是初学者。我在我的Oracle数据库中有一个表单视图: create or replace view vw_awkward_view as select unique tab1.some_column1, tab2.some_column1, tab2.some_column2, tab2.some_column3 from table_1 tab1, table_2 tab2 WHERE .... 我需要'tab1.some_column1'上的'unique'子句,因为它

这里是初学者。我在我的Oracle数据库中有一个表单视图:

create or replace view vw_awkward_view as
select unique tab1.some_column1,
  tab2.some_column1,
  tab2.some_column2,
  tab2.some_column3
from table_1 tab1,
 table_2 tab2
WHERE ....
我需要'tab1.some_column1'上的'unique'子句,因为它的基础表中有许多条目。我还需要在视图中包含“tab1.some_column1”,因为没有它,其余数据就没有多大意义

在Apex中,我想在该视图上创建一个报告,并使用一个表单对其进行编辑(仅限更新)。我不需要编辑tab1.some_column1。只有视图中的其他列需要可编辑。我通常可以使用'instead of'触发器来实现这一点,但是当视图包含'distinct'、'unique'或'group by'子句时,这看起来是不可能的

如果尝试更新此视图上的行,则会出现以下错误:

ORA-02014: cannot select FOR UPDATE from view with DISTINCT, GROUP BY, etc.

如何避免这个错误?我希望我的'instead of'触发器启动并执行更新,我不需要编辑包含'unique'子句的列,因此我认为应该可以这样做

我认为您应该能够删除“unique”。
如果tab2.some_column1、tab2.some_column2、tab2.some_column3不是唯一的,那么您希望如何更新它们?
如果它们是唯一的则整个结果:tab1.some_column1,tab2.some_column1,tab2.some_column2,tab2.some_column3是唯一的


当您在sql查询中声明“unique”或“distinct”时,它不仅适用于“tab1”。某些列1

我认为您应该能够删除“unique”。
如果tab2.some_column1、tab2.some_column2、tab2.some_column3不是唯一的,那么您希望如何更新它们?
如果它们是唯一的则整个结果:tab1.some_column1,tab2.some_column1,tab2.some_column2,tab2.some_column3是唯一的


当您在sql查询中声明“unique”或“distinct”时,它不仅适用于“tab1”。某些列1希望我的问题方向正确;)

您可以通过执行以下操作来实现查询:

select a.some_column1, tab2.some_column1, tab2.some_column2, tab2.some_column3 
  from table_2 tab2 
  join (select distinct some_column1 from table_1) a
    on tab2.column_in_tab1 = a.some_column1
出现
ORA-02014
错误的原因是自动生成的
ApplyMRU
过程。此进程将尝试锁定已更改的行:

要获取
some_表
表中一行的校验和,其中列1、2、5、7、10、12、14是可编辑的

最后,它的结构应该是这样的:

  • 环路阵列
  • 为可编辑列的当前值生成校验和 从数据库
  • 将此校验和与提交的校验和进行比较 (如果生成了apex_application.g_fcs)如果校验和匹配, 继续更新。如果没有,请在此处失败该过程
  • 锁定正确的记录以进行更新。指定nowait,然后 锁定失败,进程失败
  • 使用提交的值更新视图。你的枪代替了扳机 我会开枪的。确保对update语句使用正确的值,以便只更新这一条记录
  • 不要在中间提交。要么全是,要么什么都不是。


    我几乎感觉自己太过火了,可能感觉有点太多了,但是当你知道其中的陷阱时,其实完成这个定制过程并不难!对我来说,玩它是很有学问的:p

    希望我在这里回答了你的问题;)

    您可以通过执行以下操作来实现查询:

    select a.some_column1, tab2.some_column1, tab2.some_column2, tab2.some_column3 
      from table_2 tab2 
      join (select distinct some_column1 from table_1) a
        on tab2.column_in_tab1 = a.some_column1
    
    出现
    ORA-02014
    错误的原因是自动生成的
    ApplyMRU
    过程。此进程将尝试锁定已更改的行:

    要获取
    some_表
    表中一行的校验和,其中列1、2、5、7、10、12、14是可编辑的

    最后,它的结构应该是这样的:

  • 环路阵列
  • 为可编辑列的当前值生成校验和 从数据库
  • 将此校验和与提交的校验和进行比较 (如果生成了apex_application.g_fcs)如果校验和匹配, 继续更新。如果没有,请在此处失败该过程
  • 锁定正确的记录以进行更新。指定nowait,然后 锁定失败,进程失败
  • 使用提交的值更新视图。你的枪代替了扳机 我会开枪的。确保对update语句使用正确的值,以便只更新这一条记录
  • 不要在中间提交。要么全是,要么什么都不是。


    我几乎感觉自己太过火了,可能感觉有点太多了,但是当你知道其中的陷阱时,其实完成这个定制过程并不难!对我来说,玩这个游戏是很有学问的:p汤姆的回答是处理这个问题的正确方法,但如果我理解正确,我认为你的要求太过分了


    最简单的方法可能是在要编辑的表上创建表单。然后让报表编辑链接将用户带到该表单,该表单将只更新一个表中所需的列。如果需要显示的另一个表中的列的值,则创建链接将该值传递给表单时非常简单,表单可以包含一个仅显示项来显示该值

    汤姆的回答是处理这个问题的正确方法,但如果我理解正确,我认为你的要求太过分了


    最简单的方法可能是在要编辑的表上创建表单。然后让报表编辑链接将用户带到该表单,该表单将只更新一个表中所需的列。如果需要显示的另一个表中的列的值,则创建链接将该值传递给表单时非常简单,表单可以包含一个仅显示项来显示该值

    所有字段都是唯一的-tab1.some_column1,tab2.some_column1,tab2.some_column2,tab2.some_column3。如果tab2.some_column1、tab2.some_column2、tab2.some_column3已经是唯一的,那么为什么需要唯一的?还是我遗漏了什么?啊
    select utl_raw.cast_to_raw(dbms_obfuscation_toolkit.md5(input_string=>
             "COLUMN1"    ||'|'||
             "COLUMN2"    ||'|'||
             "COLUMN5"    ||'|'||
             "COLUMN7"    ||'|'||
             "COLUMN10"   ||'|'||
             "COLUMN12"   ||'|'||
             "COLUMN14"   ||
             '|||||||||||||||||||||||||||||||||||||||||||'
          )) md5
    from some_table