我正在尝试构建一个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行但尚未能够...
非常感谢任何帮助,参考链接,提示(甚至解决方案!)!
答案 0 :(得分:2)
将该逻辑推入触发器会更容易。不要让触发器构建复杂的数据结构,然后将其传递给通用函数。相反,重复每列的逻辑:比较旧列和新列,并在必要时创建COL_MODIFIED
记录。
触发器看起来非常重复,但可以根据数据字典动态生成。有关示例,请参阅this classic Ask Tom thread。
谨防Oracle中的无限通用和动态数据结构。有几个选项,例如ANYDATA,Object Relational和XMLType。它们是有趣的技术,每种技术在正确的环境中都非常有用。但它们很复杂,常常导致inner platform effect。