Запрос для определения дельта в столбцах

Я хочу написать запрос, который будет читать один и тот же столбец из двух таблиц 1. из master 2. из таблицы аудита. и вернуть имя столбца вместе с новым и старым значением, если есть изменение значения, например.

главный запрос: select issue_date,issue_price,issue_entity from voucher where voucher_id=x; запрос аудита: select issue_date,issue_price,issue_entity from voucher_audit where version=2 and voucher_id=x;

Обратите внимание, что ваучер и ваучер_аудит имеют одну и ту же структуру таблицы, за исключением того, что номер версии является дополнительным в таблицах аудита.

то результат должен быть

column_name old_value new_value
issue_price 36 38 
issue_date 01/03/14 02/03/14
1 ответ

Вы должны получить все столбцы с одинаковым именем в обеих таблицах. Затем вы должны получить значение каждого столбца, используя динамический SQL.

DECLARE
 input_voucher_id VARCHAR2(100) := '&voucher_id';
 input_version VARCHAR2(100):='&version';
 CURSOR c_common_column IS
 SELECT u.COLUMN_NAME
 FROM user_tab_cols u
 WHERE u.TABLE_NAME = 'VOUCHER'
 AND EXISTS
 (SELECT 1
 FROM user_tab_cols u1
 WHERE u1.TABLE_NAME = 'VOUCHER_AUDIT'
 AND u1.COLUMN_NAME = u.COLUMN_NAME);
 v_first_sql VARCHAR2(1000):='' ;
 v_second_sql VARCHAR2(1000) :=''; 
 first_table_value VARCHAR2(100) := '';
 second_table_value VARCHAR2(100) := '';
BEGIN
 dbms_output.put_line('Column Name,old_value,new_value');
 FOR x IN c_common_column LOOP
 v_first_sql:='SELECT '||x.COLUMN_NAME|| ' from voucher where voucher_id=:voucher_id';
 v_second_sql :='SELECT '||x.COLUMN_NAME|| ' from voucher_audit where voucher_id=:voucher_id and version = :version';
 EXECUTE IMMEDIATE v_first_sql
 INTO first_table_value
 USING input_voucher_id;
 EXECUTE IMMEDIATE v_second_sql
 INTO second_table_value
 USING input_voucher_id, input_version;
 if first_table_value != second_table_value then 
 dbms_output.put_line(x.COLUMN_NAME ||','|| first_table_value || ',' ||
 second_table_value);
 end if;
 END LOOP;
END;

licensed under cc by-sa 3.0 with attribution.