Как исправить историю записи - PullRequest
0 голосов
/ 07 июня 2019

Я хочу обновить данные истории в базе данных oracle.

emp таблица

ID      SALE_COM    UPDATEDATE              SALES_DT
4173    40          09-APR-2016 20:04:07    null
4173    40          20-SEP-2016 20:04:11    null
4173    30          06-OCT-2016 20:04:07    null
4173    30          14-OCT-2016 20:04:07    null
4173    30          26-MAR-2017 20:50:41    null

emp_hist

EMP_ID  FIN_Y_ID    PRD_SEQ  FIELD_VALUE    FIN_DATE
2167    13          4        30             28/09/14 0:00

ВЫХОД

4173    30  06-OCT-2016 20:04:07    28/09/14 0:00

1 Ответ

0 голосов
/ 07 июня 2019

Я не решаюсь ответить на этот вопрос без четкого определения проблемы, но вот мое толкование:

  1. Есть две таблицы: emp и emp_hist
  2. 2167, показанное в emp_hist в исходном сообщении, неверно и должно быть 4173
  3. Когда EMP.SALES_COM обновляется, вы хотите обновить EMP.SALES_DT из значения EMP_HIST.FIN_DATE, где EMP.ID = EMP_HIST.EMP_ID

Предполагая, что EMP_HIST.EMP_ID уникален, вы можете создать триггер на EMP, который выполняет # 3 выше:

SQL> SELECT id, sale_com, TO_CHAR(updatedate, 'DD-MON-YYYY HH24:MI:SS') updatedate,
  2          TO_CHAR(sales_dt, 'DD/MM/YY HH24:MI') sales_dt
  3    FROM emp;

        ID   SALE_COM UPDATEDATE                    SALES_DT      
---------- ---------- ----------------------------- --------------
      4173         40 09-APR-2016 20:04:07                        
      4173         40 20-SEP-2016 20:04:11                        
      4173         30 06-OCT-2016 20:04:07                        
      4173         30 14-OCT-2016 20:04:07                        
      4173         30 26-MAR-2017 20:50:41                        

SQL> SELECT emp_id, FIN_Y_ID, PRD_SEQ, FIELD_VALUE, TO_CHAR(FIN_DATE, 'YY/MM/DD HH24:MI') fin_date
  2    FROM emp_hist;

    EMP_ID   FIN_Y_ID    PRD_SEQ FIELD_VALUE FIN_DATE      
---------- ---------- ---------- ----------- --------------
      4173         13          4          30 14/09/28 00:00

SQL> CREATE OR REPLACE TRIGGER emp_upd_sale_com BEFORE UPDATE ON emp FOR EACH ROW
  2  BEGIN
  3    SELECT fin_date
  4      INTO  :new.sales_dt
  5      FROM emp_hist
  6      WHERE emp_id = :old.id;
  7  END;

Trigger EMP_UPD_SALE_COM compiled

SQL> UPDATE emp SET sale_com = 30
  2    WHERE id = 4173 AND updatedate = TO_DATE('06-OCT-2016 20:04:07', 'DD-MON-YYYY HH24:MI:SS');

1 row updated.

SQL> SELECT id, sale_com, TO_CHAR(updatedate, 'DD-MON-YYYY HH24:MI:SS') updatedate,
  2         TO_CHAR(sales_dt, 'DD/MM/YY HH24:MI') sales_dt
  3    FROM emp;

        ID   SALE_COM UPDATEDATE                    SALES_DT      
---------- ---------- ----------------------------- --------------
      4173         40 09-APR-2016 20:04:07                        
      4173         40 20-SEP-2016 20:04:11                        
      4173         30 06-OCT-2016 20:04:07          28/09/14 00:00 <<<< Updated row
      4173         30 14-OCT-2016 20:04:07                        
      4173         30 26-MAR-2017 20:50:41                        
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...