Во-первых, я думаю, что вы можете сделать это без использования PL / SQL. Следующий запрос будет представлять ваш вывод в обычном SQL:
WITH cur_table (val, trn_date) AS
(
SELECT 'Z', SYSDATE FROM DUAL
),
hist_table (old_val, trn_date) AS
(
SELECT DECODE(LEVEL, 26, NULL, CHR(90-LEVEL)), SYSDATE-LEVEL
FROM DUAL
CONNECT BY LEVEL <= 26
)
SELECT *
FROM (SELECT sub.val AS OLD_VAL,
LEAD(sub.val) OVER (ORDER BY sub.trn_date) AS NEW_VAL,
sub.trn_date
FROM (SELECT c.val, c.trn_date
FROM cur_table c
UNION ALL
SELECT h.old_val, h.trn_date
FROM hist_table h) sub)
WHERE new_val IS NOT NULL;
Если вам нужно использовать PL / SQL, просто вызовите запрос выше и BULK COLLECT INTO v_tab
, вам нужно будет расширить ваша запись принять третье значение. Вам даже не нужно CURSOR
. Затем мы можем l oop просмотреть результаты:
dbms_output.put_line('Old Value'||CHR(9)||'New Value');
IF v_tab.count > 0 THEN
FOR i IN 1..v_tab.LAST() LOOP
dbms_output.put_line(v_tab(i).old_value||chr(9)||v_tab(i).new_value);
END LOOP;
END IF;
Это будет выводить в формате, который вы первоначально указали (CHR (9) вкладок более, вам может потребоваться настроить, чтобы получить правильный интервал). Существуют и другие способы для сбора коллекции, но мне нравится этот. Вы также можете использовать L OOP -EXIT WHEN NULL или заменить 1 на v_tab.FIRST ().