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

и я получаю эту ошибку после выполнения:

Ошибка запуска в строке: 140 в команде -
ВСТАВИТЬ В ОРДЕМ (cod_ordem,data,codigo_func_m,tipo_ordem,matricula,estado_ordem)
ЗНАЧЕНИЯ (ТО_СНАК (seq_cod_ordem.nextval),to_date('23/11/2014','дд / мм / гггг'),'2','SERVICO','66-АВ-00','Pendente')
Сообщение об ошибке -
Ошибка SQL: ORA-01403: нет данных.
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;

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;
Другие вопросы по тегам