Сравните значения одного столбца в таблице PL / SQL, используя цикл - PullRequest
2 голосов
/ 03 апреля 2020

после этого мне нужно передать сравниваемые значения строк. Как мы можем сравнить значения одного столбца в таблице PL SQL, используя l oop? После этого мне нужно ряд труб сравниваемые значения. Запись:

type rec is record (tab_value varchar2(4000),
        trn_date date);
        V_REC REC;
        --table
        type tab is table of rec;
        V_TAB TAB;
    -- variable
    v_query(4000);
    -- defining cursor
      TYPE CUR IS REF CURSOR;
      V_CUR CUR;
    -- query
    -- MASTER TABLE
    v_query := ' SELECT D.DESCRIPTION  AS TAB_VALUE,--column on which dml performs
                        D.TRN_DATE
                      FROM TEST.TABLE D
                     WHERE 1 = 1 '||
          ' UNION
    SELECT D.DESCRIPTION AS TAB_VALUE,-- column which stores old value of master table
                    D.NEW_TRN_DATE AS TRN_DATE
                  FROM TEST.SYN_TABLE D
                 WHERE 1 = 1 ';

Когда DML выполняется для столбца описания ( D.DESCRIPTION ) главной таблицы, тогда недавнее значение основной таблицы --- сохраняется в таблице истории

--opening cursor      
OPEN V_CUR_HIST FOR V_QUERY;
      -- loop started
      LOOP
        FETCH V_CUR 
          INTO V_REC;
        EXIT WHEN V_CUR_HIST%NOTFOUND;

        V_TAB(V_INDEX).TAB_VALUE  := V_REC.TAB_VALUE;--contains value of master & history table
        V_TAB(V_INDEX).TRN_DATE   := V_REC.TRN_DATE;
    --adding increment in v_index
        V_INDEX := V_INDEX + 1;

    END LOOP;

Теперь мне нужно сравнение данных основного значения и значения таблицы истории в виде вывода:

old_value(history table value)      new_value(master table value)
                                    a
a                                   b
b                                   c
c                                   d 

1 Ответ

0 голосов
/ 03 апреля 2020

Во-первых, я думаю, что вы можете сделать это без использования 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 ().

...