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

Я хочу написать запрос, который будет читать один и тот же столбец из двух таблиц 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.