クエリ結果から2つのレコードを比較し、クエリ結果の間で変更された列のみを表示するOracleパイプライン関数を使用したいと思いますか?2つのレコードを比較して差異だけを表示
1
A
答えて
2
そのはなく、かなり何をしたいが、OracleFAQのケビン・ミードのブログは、私の作品解決策を持っています
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を使っていると言います。
それは、パイプライン機能する「を持つ」でしょうか? –