我有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;
我在做什么错了?
答案 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;}