当我尝试在其上连接两个表时,我的触发器开始循环并出现大小写错误

时间:2019-07-02 13:26:01

标签: oracle

我有2张桌子,即Contract和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 个答案:

答案 0 :(得分:1)

很多触发器都是不必要的。

无需memcpy,也不需要定义变量即可实现目标。

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

答案 1 :(得分:0)

看看更新:

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