Сравните две записи и покажите только разницу - PullRequest
1 голос
/ 26 июля 2011

Мне нужна конвейерная функция Oracle, которая сравнивает две записи из результата запроса и показывает только столбец, который изменился между результатами запроса?

Ответы [ 2 ]

3 голосов
/ 26 июля 2011

Вот тупой инструмент подхода к проблеме.

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>

Теперь, несомненно, вы бы хотели что-то менее подробное. Я думаю, что возможно сделать что-то, используя расширенный динамический SQL метода 4, который был представлен в 11g. Увы, вы говорите, что используете 10 г.

2 голосов
/ 27 июля 2011

Это не совсем то, что вы хотите, но блог Кевина Мида на OracleFAQ имеет решение, которое работает для меня:

http://www.orafaq.com/node/1826

http://www.orafaq.com/files/column_diffs.txt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...