2

同じ(ただし不明な)行タイプの2つの行から違いを抽出するOracle関数を構築しようとしています。最終的な目標は、:NEW と :OLD を COLUMN_NAMES とともに汎用関数に送信するトリガーで変更を収集することです。

例として、関数に (最初の 2 つのパラメーターとして) 行を渡すことができるテーブルの例を 3 つ挙げました。

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 つのオブジェクトには同じ番号または列 (#C など) の 1 つの行が含まれ、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;

私が実際にやろうとしていることは次のとおりです。3行(パラメータ)の値を並べてCOL_MODIFIED行のテーブル(説明どおり)を返します。例として、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 に答える