Oracle 当我试图连接两个表时,我的触发器出现循环和大小写错误
我有两张桌子,合同和银行卡 我需要从合同表中获取日期字段,并在银行卡表中设置日期,但我认为这是一个循环 我怎么做 这是我的密码:Oracle 当我试图连接两个表时,我的触发器出现循环和大小写错误,oracle,Oracle,我有两张桌子,合同和银行卡 我需要从合同表中获取日期字段,并在银行卡表中设置日期,但我认为这是一个循环 我怎么做 这是我的密码: 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 <
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;
我做错了什么?看看更新:
{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;}
大部分触发是不必要的 您可以在没有案例和定义变量的情况下实现目标
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;
/
请注意:
如果要捕获空值,请添加上面显示的NVL
注意在ctcontra中找不到相应记录的情况。这种情况会导致ORA-01403:找不到可能正是您在这种情况下所需要的数据
确保ctcontra对每个cd_contrato值只有一条记录,否则您将得到ORA-01422:exact fetch返回的行数超过请求的行数。您得到的错误是什么?当它不在循环中时,执行CASE语句时抛出错误:CASE not found该错误意味着您的CASE语句末尾没有默认子句。也许您应该改为使用IF语句,因为这限制性较小。如果不添加ELSE子句,IF语句的默认设置是什么也不做。你说什么时候它不在循环中?关于循环,在某些情况下,它不会抛出错误,而是系统冻结,我想它是在循环中,因为触发器…但是,我会尝试使用IF,看看会发生什么,我会回来,说它是否有效。泰!在你的触发器中没有循环,所以如果事情冻结,它很可能与你的触发器无关;可能是锁或代码的其他部分导致了问题。它将在所有数据库中运行?这不起作用。这将导致ORA-04091:表GFLANCAM发生突变错误。您不能在这样的行级触发器中对同一个表执行更新。我如何在插入后执行更新?您想完成什么?不能更改AFTER触发器中的行,因此应使用BEFORE触发器。这个词只表示触发器在更改实际写入数据库之前执行,此时代码可以对记录进行后处理。看看我在回答中提供的代码是否有效。