Мой триггер получает зацикливание и ошибка случая, когда я пытаюсь соединить две таблицы на нем - PullRequest
1 голос
/ 02 июля 2019

У меня есть 2 таблицы, Контракт и Bankslip.

Мне нужно получить поле даты из таблицы контрактов и установить дату в таблице Bankslip, но я думаю, что она зацикливается!

Как я могу это сделать?

Вот мой код:

create or replace TRIGGER GFLANCAM_ATUALIZA_DATA_EMISSAO
    BEFORE INSERT ON GFLANCAM
    FOR EACH ROW

DECLARE

    DATA_INICIO_CONTRATO DATE;

BEGIN

    CASE WHEN :NEW.DOCUMENTO <> ' ' then  

        SELECT dt_inicio 
           INTO DATA_INICIO_CONTRATO 
        from ctcontra 
        where cd_contrato = :NEW.documento;

    :NEW.data := DATA_INICIO_CONTRATO;

    END CASE;

END;

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Большая часть триггера не нужна.

Вы можете достичь своей цели без CASE и без определения переменной.

CREATE OR REPLACE TRIGGER GFLANCAM_ATUALIZA_DATA_EMISSAO
   BEFORE INSERT
   ON GFLANCAM
   FOR EACH ROW
BEGIN
   -- Consider following:
   -- IF NVL (:NEW.DOCUMENTO, ' ') <> ' '
   IF :NEW.DOCUMENTO <> ' '
   THEN
      -- Following line may cause ORA-01403: no data found
      SELECT dt_inicio INTO :NEW.data FROM ctcontra WHERE cd_contrato = :NEW.documento;
   END IF;
END;
/

Несколько замечаний:

Если вы хотите поймать NULL значений, добавьте NVL, показанный выше.

Следите за случаем, когда соответствующая запись не найдена в ctcontra - это условие приведет к ORA-01403: no data found (что в данном случае может быть именно тем, что вам нужно).

Убедитесь, что ctcontra имеет только одну запись для каждого значения cd_contrato, в противном случае вы получите ORA-01422: exact fetch returns more than requested number of rows.

0 голосов
/ 02 июля 2019

Посмотрите на обновление:

{CREATE OR REPLACE TRIGGER GFLANCAM_ATUALIZA_DATA_EMISSAO
AFTER INSERT ON GFLANCAM
FOR EACH ROW

DECLARE

DATA_INICIO_CONTRATO DATE;

BEGIN

IF DOCUMENTO <> ' ' THEN  
    SELECT dt_inicio INTO DATA_INICIO_CONTRATO from ctcontra where cd_contrato = 
DOCUMENTO;  
    UPDATE GFLANCAM SET DATA = DATA_INICIO_CONTRATO;
END IF;

END;}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...