【问题标题】:ORA-01403 no data found in trigger executionORA-01403 在触发器执行中找不到数据
【发布时间】:2015-01-23 09:54:56
【问题描述】:

我的触发器有问题。触发器的目的是验证与汽车注册相关的客户在车间支付或未支付账单。如果客户已支付所有费用,则创建一个新的服务订单(到目前为止运行),但随后支付的帐户无法创建工作订单。因此,当我尝试插入服务时,就会出现问题。

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

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')

执行后我收到此错误:

从行开始的错误:命令中的 140 - 插入 ORDEM(cod_ordem,数据,codigo_func_m,tipo_ordem,matricula,estado_ordem) 值(to_char(seq_cod_ordem.nextval),to_date('23/11/2014','dd/mm/yyyy'),'2','Serviço','66-AB-00','Pendente') 错误报告 - SQL 错误:ORA-01403:não foram encontrados dados ORA-06512: 无 "BD1415_DC5.SALDO_CLIENTE_OFICINA", linha 7 ORA-04088: 执行时出错触发 'BD1415_DC5.SALDO_CLIENTE_OFICINA' 01403. 00000 - “未找到数据” *原因: *行动:

这是我的代码:

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;

【问题讨论】:

  • 第一个查询 'SELECT DINSTINCT ... INTO ...' 没有返回任何行,这是异常的原因。您需要将查询包含在 'BEGIN ... EXCEPTION NO_DATA_FOUND... END' 块中以捕获此异常并对其进行处理

标签: oracle plsql triggers ora-01403


【解决方案1】:

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

 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;

【讨论】:

  • 谢谢。甚至这也是问题所在。在开始实现触发器之前我已经体验过选择,然后我复制粘贴...感谢您的帮助:)
猜你喜欢
  • 2021-04-08
  • 1970-01-01
  • 2021-06-19
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
相关资源
最近更新 更多