无法正确编写触发器

问题描述 投票:0回答:1

我从名为 Carti 的表创建了一个视图,并更新了其中的一些内容,这样做会自动更新表 Carti 的原始内容。为了防止这种情况发生,我尝试编写一个触发器,将新价格设置为等于旧价格。我一直无法让它发挥作用。我收到以下错误:

View TOP_3_CARTI created.

>>Query Run In:Query Result 4

Error starting at line : 370 in command -
UPDATE top_3_carti
SET pret = 1.15*pret
Error at Command Line : 370 Column : 8
Error report -
SQL Error: ORA-04098: trigger 'SAVUA_49.ROLLBACK_PRETURI' is invalid and failed re-validation
04098. 00000 -  "trigger '%s.%s' is invalid and failed re-validation"
*Cause:    A trigger was attempted to be retrieved for execution and was
           found to be invalid.  This also means that compilation/authorization
           failed for the trigger.
*Action:   Options are to resolve the compilation/authorization errors,
           disable the trigger, or drop the trigger.

Trigger ROLLBACK_PRETURI compiled

LINE/COL  ERROR
--------- -------------------------------------------------------------
7/1       PLS-00103: Encountered the symbol "SELECT" 
Errors: check compiler log

CREATE OR REPLACE VIEW top_3_carti
AS
    SELECT c.* FROM Carti c WHERE c.id_carte IN (
        SELECT c.id_carte
        FROM Carti c, Continut_vanzari cv
        WHERE c.id_carte = cv.id_carte
        GROUP BY c.id_carte, c.pret
        ORDER BY SUM(cv.cantitate) DESC
        FETCH FIRST 3 ROWS ONLY
    );

SELECT * FROM top_3_carti;

UPDATE top_3_carti
SET pret = 1.15*pret;

CREATE OR REPLACE TRIGGER rollback_preturi
BEFORE UPDATE ON Carti
FOR EACH ROW
BEGIN
    IF :NEW.pret != :OLD.pret THEN
        :NEW.pret := :OLD.pret;
    END IF;
END rollback_preturi;

SELECT c.* FROM Carti c WHERE c.id_carte IN (
        SELECT c.id_carte
        FROM Carti c, Continut_vanzari cv
        WHERE c.id_carte = cv.id_carte
        GROUP BY c.id_carte, c.pret
        ORDER BY SUM(cv.cantitate) DESC
        FETCH FIRST 3 ROWS ONLY
        );
sql view triggers compiler-construction oracle-sqldeveloper
1个回答
0
投票

您应该使用斜杠字符终止 PL/SQL 脚本:

CREATE OR REPLACE TRIGGER rollback_preturi
BEFORE UPDATE ON Carti
FOR EACH ROW
BEGIN
    IF :NEW.pret != :OLD.pret THEN
        :NEW.pret := :OLD.pret;
    END IF;
END rollback_preturi;
/                                  --> this
© www.soinside.com 2019 - 2024. All rights reserved.