PLS-00049: Eroor при использовании: NEW - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть две таблицы

A(#ref_medic,libelle, vignette,remarque, qtestock)
B(#ref_medic, #dateF, qte_lot, unite, remarque)

Я хочу использовать вместо вставки триггер, чтобы вставить строку в B, если строка, имеющая ref_medic, существует в A, но не в B.

Я получаю сообщение об ошибке:

PLS-00049: переменная неверного связывания 'NEW.REF_MEDIC'

всякий раз, когда я вставляю в это представление:

Это представление, которое я вставляю благодаря INSTEAD OF INSERT TRIGGER

CREATE VIEW myview(reference,libelle,vignette, date_peremption, Quantite,unite,
    Remarque) AS
    SELECT M.ref_medic, libelle, vignette, dateF,Qte_lot,unite,LM.remarque
    FROM Medicament M, Lot_medicament LM
    WHERE M.ref_medic=LM.ref_medic
    AND qte_lot>0;

Я попытался удалить :NEW, но это не то, что я с нетерпением жду, так как хочу вставить эту строку в B:

INSERT INTO myview VALUES
('12AS45','test','yes','06/06/2021',30,'boite','test');

PLS-00049: переменная attachée (переменная связывания) erronée 'NEW.REF_MEDIC'

Мы должны получить следующий результат: строка не будет вставлена ​​в B, поскольку она существует там

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Есть ли знак "#" в названии вашей колонки?это может вызвать проблемы.

В противном случае оно должно работать.

Вот проверенный пример:

create table Medicament(
ref_medic VARCHAR2(10),
libelle VARCHAR2(30),
vignette VARCHAR2(3),
remarque VARCHAR2(50),
qtestock NUMBER);

create table Lot_medicament(
ref_medic VARCHAR2(10),
dateF DATE,
qte_lot NUMBER,
unite VARCHAR2(15),
remarque VARCHAR2(50));

CREATE VIEW myview(reference,libelle,vignette, date_peremption, Quantite,unite, Remarque) AS
  SELECT M.ref_medic, libelle, vignette, dateF, Qte_lot, unite, LM.remarque
  FROM Medicament M, Lot_medicament LM
  WHERE M.ref_medic = LM.ref_medic
  AND qte_lot > 0;

CREATE OR REPLACE TRIGGER instead_insert_in_myview
INSTEAD OF INSERT ON myview
DECLARE
  med_ref  Medicament.ref_medic%TYPE;
BEGIN
  BEGIN
    SELECT ref_medic into med_ref FROM Medicament where ref_medic = :new.reference;
  EXCEPTION
   WHEN NO_DATA_FOUND THEN
     med_ref := NULL;
  END;
  IF med_ref IS NULL THEN
    INSERT INTO Medicament(ref_medic, libelle, vignette, remarque, qtestock)
     VALUES (:new.reference, :new.libelle, :new.vignette, :new.remarque, :new.Quantite);
  END IF;
  INSERT INTO Lot_medicament(ref_medic, dateF, qte_lot, unite, remarque)
   VALUES (:new.reference, :new.date_peremption, :new.Quantite, :new.unite, :new.remarque);
END instead_insert_in_myview;
/

INSERT INTO myview VALUES
('12AS45','test','yes','06/06/2021',30,'boite','test');

затем

select count(*) from Medicament;

дает вамодна строка, и

select count(*) from Lot_medicament;

также дает вам одну строку.

0 голосов
/ 14 апреля 2019

Ошибка записи : NEW.ref_med вместо : NEW.reference внутри триггера.

Спасибо всем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...