ORA-01403在触发器执行中未找到任何数据

时间:2014-11-25 11:51:00

标签: oracle plsql triggers ora-01403

这里有一个触发器问题。触发器的目的是验证与车辆登记相关联的客户,在车间中支付或未支付账单。如果客户已付全部,则会创建一个新的服务订单(到目前为止运行),但之后付款的帐户无法创建工单。因此,当我尝试插入服务时会出现问题。

这就是导致触发器触发的原因:

INSERT INTO ORDEM(cod_ordem,data,codigo_func_m,tipo_ordem,matricula,estado_ordem)
VALUES(to_char(seq_cod_ordem.nextval),to_date('23/11/2014','dd/mm/yyyy'),'2','Serviço','66-AB-00','Pendente')

我在执行后得到了这个错误:

Error starting at line : 140 in command -
INSERT INTO ORDEM(cod_ordem,data,codigo_func_m,tipo_ordem,matricula,estado_ordem)
VALUES(to_char(seq_cod_ordem.nextval),to_date('23/11/2014','dd/mm/yyyy'),'2','Serviço','66-AB-00','Pendente')
Error report -
SQL Error: ORA-01403: não foram encontrados dados
ORA-06512: na "BD1415_DC5.SALDO_CLIENTE_OFICINA", linha 7
ORA-04088: erro durante a execução do trigger 'BD1415_DC5.SALDO_CLIENTE_OFICINA'
01403. 00000 -  "no data found"
*Cause:    
*Action:

这是我的代码:

create or replace TRIGGER saldo_cliente_Oficina
BEFORE INSERT ON ORDEM
FOR EACH ROW
DECLARE
   t_codigo_cliente CLIENTES.codigo_cliente%TYPE;
   t_estado BOOLEAN := TRUE;
   t_excecao EXCEPTION;

BEGIN
  SELECT DISTINCT codigo_cliente INTO t_codigo_cliente
  FROM ORDEM, VEICULO
  WHERE (ORDEM.matricula = :NEW.matricula) AND (ORDEM.matricula = VEICULO.matricula);

FOR t_estado_fact IN (SELECT FACTURA.numero_factura,FACTURA.codigo_cliente,FACTURA.estado FROM                  FACTURA,CLIENTES
      WHERE CLIENTES.codigo_cliente = t_codigo_cliente AND CLIENTES.codigo_cliente =    FACTURA.codigo_cliente)LOOP
      IF t_estado_fact.estado = 'Não Paga' THEN
          t_estado := FALSE;
      END IF;    

      IF t_estado = FALSE THEN
        RAISE t_excecao;
      END IF;  
END LOOp;

EXCEPTION
  WHEN t_excecao THEN
    RAISE_APPLICATION_ERROR(-20001, 'O Proprietário do veiculo que pretende criar uma ordem, deve serviços a Oficina.');

END saldo_cliente_Oficina;

1 个答案:

答案 0 :(得分:0)

触发器中的以下选择不返回任何行。在这种情况下,ORDEM中针对特定matricula的第一个插入将始终失败。

 SELECT DISTINCT codigo_cliente INTO t_codigo_cliente
 FROM ORDEM, VEICULO
 WHERE (ORDEM.matricula = :NEW.matricula) AND (ORDEM.matricula = VEICULO.matricula);

请尝试将此更改为以下

 SELECT DISTINCT codigo_cliente INTO t_codigo_cliente
 FROM VEICULO
 WHERE VEICULO.matricula=:NEW.matricula;