2

我正在尝试构建一个 Oracle 函数来从相同(但未知)行类型的 2 行中提取差异。最终目标是收集触发器上的更改,将 :NEW 和 :OLD 与 COLUMN_NAMES 发送到通用函数。

例如,我列出了 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 行,但还没有...

任何帮助、参考链接、提示(甚至解决方案!)将不胜感激!

4

1 回答 1

2

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

触发器看起来非常重复,但它们可以根据数据字典动态生成。例如,请参阅这个经典的 Ask Tom 线程

当心 Oracle 中无限通用和动态的数据结构。有几个选项,例如ANYDATA、Object Relational 和 XMLType。它们是有趣的技术,并且在适当的环境中都非常有用。但它们很复杂,往往会导致内部平台效应

于 2013-11-08T07:28:30.150 回答