SQL оператор игнорируется и ORA-00922 в Oracle11g - PullRequest
1 голос
/ 26 февраля 2020

Я получаю две ошибки для своего триггера и не смог выяснить, где проблема, любая помощь очень ценится :) Триггер должен срабатывать при обновлении столбца ListPrice. Триггер не должен допускать, чтобы новая прейскурантная цена была меньше StandardCost + 20%. Этот триггер должен разрешать любое повышение цены. Он должен корректно отбрасывать изменения, если цена слишком низкая, или разрешать обновление, если цена не слишком низкая.

Первое создание этой таблицы:

CREATE TABLE Product (
ProductID NUMBER NOT NULL PRIMARY KEY,
ListPrice NUMBER NOT NULL,
StandardCost NUMBER NOT NULL,
ProductDesc varchar2(20) NOT NULL
);

Затем вставьте эти данные в таблицу:

INSERT INTO product VALUES(1, 20,10,'A');
INSERT INTO product VALUES(2, 21,12,'B');
INSERT INTO product VALUES(3, 22,14,'C');
INSERT INTO product VALUES(4, 23,16,'D');
INSERT INTO product VALUES(5, 40,19,'E');
INSERT INTO product VALUES(6, 22,10,'F');
INSERT INTO product VALUES(7, 25,21,'G');
INSERT INTO product VALUES(8, 29,22,'H');
INSERT INTO product VALUES(9, 25,23,'I');
INSERT INTO product VALUES(10, 30,25,'J');

Вот код для триггера, где я получаю ошибку:

CREATE OR REPLACE TRIGGER Product_Price_Check
BEFORE UPDATE OF listprice ON product
FOR EACH ROW
DECLARE
sCost NUMBER(10,5);
BEGIN
sCost := (:old.standardcost + (:old.standardcost*0.2));
IF((:new.listprice) > (:old.listprice))
THEN
SET :old.listprice := :new.listprice;
END IF;
IF (:new.listprice < (sCost))
THEN
RAISE_APPLICATION_ERROR(-20101,'cannot update as price is less');
END IF;
END;
/

Это коды ошибок:

Ошибка (6,1): PL / SQL: SQL Оператор игнорируется
Ошибка (6,5): PL / SQL: bORA-00922: отсутствует или недействителен

1 Ответ

1 голос
/ 26 февраля 2020

Я понимаю, что не нужно вводить ключевое слово SET в коде. Вместе с тем мы не можем присвоить значение старому. Я прокомментировал эту часть в коде ниже. Кроме того, вы можете полностью прокомментировать первый блок if, так как вам нужно только вызвать ошибку, если ваши условия не выполняются, иначе это позволит обновить.

create or replace trigger product_price_check before
    update of listprice on product
    for each row
declare
    scost   number(
        10,5
    );
begin
    scost   :=:old.standardcost + (:old.standardcost * 0.2 );

    --if :new.listprice > :old.listprice then
        -- set :old.listprice   := :new.listprice;
    --end if;

    if (:new.listprice < ( scost ) ) then
        raise_application_error(
            -20101,
            'cannot update as price is less'
        );
    end if;

end;
/
...