Oracle - PL SQL / Вставить строку, если обновление было сделано - PullRequest
0 голосов
/ 03 марта 2020

Я хочу сделать журнал об обновлении. Поэтому я хочу вставить журнал, если был сделан запрос на обновление.

    UPDATE DEPOT_IMPORT SET DEPOT_IMPORT.CD_REGATE = 
      (SELECT CONTROLE_IMPORT_REGATE.NEW_REGATE
       FROM CONTROLE_IMPORT_REGATE 
       WHERE DEPOT_IMPORT.CD_REGATE = CONTROLE_IMPORT_REGATE.OLD_REGATE)
WHERE DEPOT_IMPORT.CD_REGATE in (SELECT DISTINCT OLD_REGATE FROM CONTROLE_IMPORT_REGATE);
-- INSERTION AVIS FONCTIONNEL
INSERT INTO DEPOT_AVIS_FONCTIONNEL VALUES (p_id_depot,'Modification du regate car obsolète','AFO505');

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Хорошо, спасибо, теперь я должен изучить триггер:)

Triggers очень полезны, когда вы делаете logging/auditing. Следовательно, обучение trigger не должно быть чрезмерным.

См. Демонстрационный пример ниже, который упрощает ваши требования.

- В таблице создана и вставлена ​​запись, например,

CREATE TABLE depot_import ( cd_regate   NUMBER);

INSERT INTO depot_import VALUES ( 1 );

- Создан триггер для таблицы depot_import для обработки logging, т. Е. Вставка в 'depot_avis_fonctionnel'

CREATE OR REPLACE TRIGGER trk_upd BEFORE
    UPDATE ON depot_import
    FOR EACH ROW
BEGIN
    INSERT INTO depot_avis_fonctionnel VALUES (
        :new.cd_regate,
        'Modification du regate car obsolète',
        'AFO505'
    );
END;

Обновление таблицы:

UPDATE depot_import
    SET
        cd_regate = 3
WHERE cd_regate = 1;

Commit;

Records вставляется через triggers.

- Выбор

SQL>  SELECT * FROM depot_avis_fonctionnel;
      COL1 COL2                                                                             COL3
---------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
         3 Modification du regate car obsolète                                              AFO505
0 голосов
/ 03 марта 2020

ОК, я вижу UPDATE:

UPDATE DEPOT_IMPORT SET DEPOT_IMPORT.CD_REGATE = ...

Что такое log ?

INSERT INTO DEPOT_AVIS_FONCTIONNEL ...

В любом случае: если вы используете его как часть блока PL / SQL, вы можете сделать что-то вроде этого:

begin
  update depot_import set ...

  -- Log the update:
  insert into log_table (cdate, text, rows_affected) values
    (sysdate, 'Table DEPOT_IMPORT has been updated', sql%rowcount);

  insert into dep DEPOT_AVIS_FONCTIONNEL ...

  -- Log the insert:
  insert into log_table (cdate, text, rows_affected) values
    (sysdate, 'Table DEPOT_AVIS_FONCTIONNEL has been inserted', sql%rowcount);
end;

Если вы используете чистый SQL, то да - вы, вероятно, будете использовать триггер. Он запускается для каждой таблицы отдельно, поэтому вам нужно будет написать столько триггеров, сколько таблиц вы изменяете.

...