当我尝试在上面加入两个表时,我的扳机会循环循环和案例错误



我有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;

我在做什么错?

不需要大部分触发器。

您可以在没有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

看更新:

{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;}

最新更新