在并行DML中涉及的表上提供复杂的默认值

时间:2011-03-16 14:16:56

标签: oracle oracle11g

我在并行运行的merge语句中涉及了许多表。合并输出到通过DBMS_ERRLOG.CREATE_ERROR_LOG函数生成的错误表。该声明工作正常,合并有效。

然后我在错误表中添加了一个额外的列,它继续工作而没有问题。

我现在希望使附加列具有基于系统中其他位置的值的默认值(实质上是批处理日期,无论如何都与当前日期时间不同) - 我正在绊倒动辄限制。

  • 我尝试使用触发器填充值 - 但是然后将触发器放在涉及并行DML的表中,这是不允许的,并且在合并期间抛出错误。 (这令人烦恼)
  • 我尝试添加基于pl / sql函数的默认值 - 这是不允许的。
  • 我尝试根据sql语句添加默认值 - 这也是不允许的。

我可以实现一个额外的更新后期处理来填充列,但是这必须为我合并的每个表完成,而且实际上有点像黑客 - 因为系统扩展了这个必须记住的每个错误表。填充默认值是首选方法。

如何根据有效的select语句解决Oracles PDML对触发器的限制,以填充此值。

2 个答案:

答案 0 :(得分:2)

这看起来有点超出了DML错误表本来要做的范围,然后是 - 并行DML规则将限制你从其他选项。解决此问题的最简单方法是将批处理日期添加到原始表中,以便它也反映在错误表中。您需要花费一些存储成本,但如果您需要按批次识别行....

或者,正如您所提到的,有一个后处理解决方案。最后,是否有一种方法可以将该信息分层到一个视图中,当您查看错误时,该视图会覆盖错误表?或者批次日期以后无法计算?

答案 1 :(得分:2)

由于该值听起来相当静态,请查看SYS_CONTEXT。 例如,我有一个记录表,我存储当前运行的模块(使用DBMS_APPLICATION_INFO设置)。

column_name VARCHAR2(256)DEFAULT SYS_CONTEXT('USERENV','MODULE'),

不确定是否为会话或进程存储了传统的上下文值。如果它不能用于并行处理,请查看GLOBAL APPLICATION CONTEXT,您可以在给定用户名的所有会话中应用该{{3}}