Цикл в триггере - PullRequest
       13

Цикл в триггере

0 голосов
/ 27 февраля 2012

Я пытаюсь реализовать триггер для поиска значений в таблице и, если он проверяет условие, вставить в другую таблицу. Триггер выглядит так:

TRIGGER DISTANCIA
AFTER INSERT ON OBSERVACION FOR EACH ROW
DECLARE
importe_multa NUMBER (3,0);
BEGIN
 FOR ROW IN (SELECT fecha_foto, hora_foto, pto_km_radar, sentido_radar, carretera_foto FROM OBSERVACION) LOOP
    IF((ROW.fecha_foto = :NEW.fecha_foto)
    AND
    (ROW.carretera_foto= :NEW.carretera_foto)
    AND
    (ROW.pto_km_radar=:NEW.pto_km_radar)
    AND
    (ROW.sentido_radar=:NEW.sentido_radar))
    THEN

    IF(ROW.hora_foto<:NEW.hora_foto-3,6/86400)
    THEN
    importe_multa:= (:NEW.hora_foto - ROW.hora_foto - 3,6/86400)*100;
    END IF;
    IF(:NEW.hora_foto < ROW.hora_foto-3,6/86400)
    THEN
    importe_multa:= (ROW.hora_foto - :NEW.hora_foto - 3,6/86400)*100;
    END IF;

   IF(importe_multa IS NOT NULL)
   THEN
     --Introducimos el valor en el campo.
     INSERT INTO SANCION(importe, fecha_foto, hora_foto, coche, tipo)
     VALUES
     (importe_multa, :NEW.fecha_foto, :NEW.hora_foto, :NEW.coche, '2');
     END IF;
    END IF;
END LOOP;
END;

Когда я пытаюсь скомпилировать программное обеспечение SQLDeveloper, выдает эту ошибку:

ORA-01008: Not all variables bound.

Я ссылаюсь на переменные в НАБЛЮДЕНИИ, верно?

1 Ответ

0 голосов
/ 27 февраля 2012

1) Триггер уровня строки в OBSERVACION не может запросить таблицу OBSERVACION.Если вы это сделаете, вы получите ошибку мутирующего триггера.Таким образом, этот подход принципиально проблематичен.

2) Я ожидаю, что вы получаете ошибку компиляции, потому что вам нужно представлять десятичные числа, используя десятичную точку в качестве разделителя, а не запятую.Запятая используется для разделения параметров функции.

3) Если вы действительно хотите реализовать логику такого рода в триггере, а не помещать ее в процедуру, которой она действительно принадлежит,вам нужно обойти ошибку мутирующего триггера с помощью серии триггеров.Это сделает ваш код значительно более сложным, трудным для понимания и трудным для отладки.Но это позволит вам сделать это, используя только триггеры.

CREATE OR REPLACE PACKAGE pkg_new_rows
AS
  TYPE typ_new_row_array 
    IS TABLE OF rowid;
  g_new_rows typ_new_row_array;
END;

CREATE OR REPLACE TRIGGER trg_before_statement
  BEFORE INSERT ON OBSERVACION
DECLARE
BEGIN
  pkg_new_rows.g_new_rows := new pkg_new_rows.typ_new_row_array();
END;

CREATE OR REPLACE TRIGGER trg_before_row
  BEFORE INSERT ON observacion
  FOR EACH ROW
DECLARE
BEGIN
  pkg_new_rows.g_new_rows.extend;
  pkg_new_rows.g_new_rows( pkg_new_rows.g_new_rows.count ) := :new.rowid;
END;

CREATE OR REPLACE TRIGGER trg_after_statement
  AFTER INSERT ON observacion
DECLARE 
  l_row observacion%rowtype;
BEGIN
  FOR i IN 1 .. pkg_new_rows.g_new_rows.count
  LOOP
    SELECT *
      INTO l_row
      FROM observacion
     WHERE rowid := pkg_new_rows.g_new_rows(i);

   <<implement your logic by querying the other rows of the OBSERVACION table
     and comparing that to the data in the l_row record>>
  END LOOP;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...