提取通用函数中的2行之间的差异(Oracle触发器)

时间:2013-11-07 15:54:25

标签: sql oracle plsql triggers oracle10g

我正在尝试构建一个Oracle函数来从两行相同(但未知)的行类型中提取差异。最终目标是收集触发器发送的更改:NEW和:OLD with COLUMN_NAMES to a generic function。

作为一个例子,我列出了3个示例表,可以将行传入(作为前2个参数)到我的函数中:

TABLE_A              TABLE_B              TABLE_C
-------              -------              -------
ID number(12)        ID number(12)        ID number(12)
NAME varchar2(30)    FNAME varchar2(30)   CATEGORY number(12)
DESC varchar2(100)   LNAME varchar2(30)   FAMILY number(12)
                     PHONE varchar2(24)   ACCEPTANCE date
                     DESC varchar2(200)

正如我们已经知道的那样,2个对象将包含1个具有相同数字或列的行(比如#C),而第3个将包含TABLE名称,我最终得到了这个函数规范:

create or replace type COL_MODIFIED is object
(
  COLUMN_NAME varchar(40),
  VALUE_A varchar2(4000),
  VALUE_B varchar2(4000),
  VALUE_TYPE VARCHAR(15),
)
/
create or replace type COLS_MODIFIED as table of COL_MODIFIED
/

function GET_MODIFS(vROW_A object, vROW_B object, vTABLE_NAME varchar2)
return COLS_MODIFIED is
begin

  <code attempts were so numerous>

end EXTRACT_CHANGES;

我实际上尝试做的是:     返回COL_MODIFIED行的表(如上所述)并排显示3行(参数)的值。举个例子,如果我们使用TABLE_B中的一行,这就是我期望的输出:

  COLUMN_NAME  |  VALUE_A  |  VALUE_B  |  VALUE_TYPE
---------------------------------------------------------
  'LNAME'      | ''        | 'TORN'    | 'VARCHAR2(30)'
  'DESC'       | 'partial' | ''        | 'VARCHAR2(200)'

我已经知道如何获取VALUE_TYPE并尝试了多种方法在并排列中输出3行但尚未能够...

非常感谢任何帮助,参考链接,提示(甚至解决方案!)!

1 个答案:

答案 0 :(得分:2)

将该逻辑推入触发器会更容易。不要让触发器构建复杂的数据结构,然后将其传递给通用函数。相反,重复每列的逻辑:比较旧列和新列,并在必要时创建COL_MODIFIED记录。

触发器看起来非常重复,但可以根据数据字典动态生成。有关示例,请参阅this classic Ask Tom thread

谨防Oracle中的无限通用和动态数据结构。有几个选项,例如ANYDATA,Object Relational和XMLType。它们是有趣的技术,每种技术在正确的环境中都非常有用。但它们很复杂,常常导致inner platform effect