2011-07-26 21 views
1

クエリ結果から2つのレコードを比較し、クエリ結果の間で変更された列のみを表示するOracleパイプライン関数を使用したいと思いますか?2つのレコードを比較して差異だけを表示

+0

それは、パイプライン機能する「を持つ」でしょうか? –

答えて

3

ここでは、この問題に対する鈍器アプローチです。このテストデータ与えそう

create or replace function col_diff 
    (p_empno_1 in emp.empno%type 
     , p_empno_2 in emp.empno%type) 
    return col_nt pipelined 
is 
    out_val col_t := new col_t(null, null, null); 
    emp_rec1 emp%rowtype; 
    emp_rec2 emp%rowtype; 
begin 
    select * 
    into emp_rec1 
    from emp 
    where empno = p_empno_1; 
    select * 
    into emp_rec2 
    from emp 
    where empno = p_empno_2; 

    if emp_rec1.ename != emp_rec2.ename 
    then 
     out_val.col_name := 'ENAME'; 
     out_val.old_val := emp_rec1.ename; 
     out_val.new_val := emp_rec2.ename; 
     pipe row (out_val); 
    end if; 
    if emp_rec1.hiredate != emp_rec2.hiredate 
    then 
     out_val.col_name := 'HIREDATE'; 
     out_val.old_val := to_char(emp_rec1.hiredate, 'DD-MON-YYYY'); 
     out_val.new_val := to_char(emp_rec2.hiredate, 'DD-MON-YYYY'); 
     pipe row (out_val); 
    end if; 
    return; 
end; 
/

、...

SQL> select empno, ename, hiredate 
    2 from emp 
    3 where empno > 8100 
    4/

    EMPNO ENAME  HIREDATE 
---------- ---------- --------- 
     8101 PSMITH  03-DEC-10 
     8102 PSMITH  02-JAN-11 

SQL> 

...私たちは、この出力を得る:

SQL> select * from table (col_diff(8101,8102)) 
    2/

COL_NAME 
------------------------------ 
OLD_VAL 
------------------------------------------------------------------- 
NEW_VAL 
------------------------------------------------------------------- 
HIREDATE 
03-DEC-2010 
02-JAN-2011 


SQL> 

、間違いなくあなたが何かをしたいと思いますあまり冗長ではありません。私は、11gで導入された拡張メソッド4動的SQLを使用して何かを行うことが可能かもしれないと思います。悲しいかな、あなたは10gを使っていると言います。