Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 当我试图连接两个表时,我的触发器出现循环和大小写错误_Oracle - Fatal编程技术网

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触发器。这个词只表示触发器在更改实际写入数据库之前执行,此时代码可以对记录进行后处理。看看我在回答中提供的代码是否有效。