【发布时间】:2018-11-03 22:06:44
【问题描述】:
CREATE OR REPLACE TRIGGER EVALUATION
BEFORE INSERT OR UPDATE OR DELETE ON BOOKING
FOR EACH ROW
DECLARE
BEGIN
SELECT BOOKING_EVALUATION FROM BOOKING WHERE BOOKING_EVALUATION > 2;
SELECT BOOKING_EVALUATION INTO EVALUATIONAUDIT FROM BOOKING;
IF INSERTING THEN
INSERT INTO EVALUATIONAUDIT (VOYAGES_ID,CUSTOMER_NAME,START_DATE,SHIP_NAME,BOOKING_EVALUATION)
VALUES(:NEW.VOYAGES_ID,:NEW.CUSTOMER_NAME,:NEW.START_DATE,:NEW.SHIP_NAME,:NEW.BOOKING_EVALUATION);
END IF;
IF UPDATING THEN
INSERT INTO EVALUATIONAUDIT (VOYAGES_ID,CUSTOMER_NAME,START_DATE,SHIP_NAME,BOOKING_EVALUATION)
VALUES(:OLD.VOYAGES_ID,:OLD.CUSTOMER_NAME,:OLD.START_DATE,:OLD.SHIP_NAME,:OLD.BOOKING_EVALUATION);
END IF;
IF DELETING THEN
INSERT INTO EVALUATIONAUDIT (VOYAGES_ID,CUSTOMER_NAME,START_DATE,SHIP_NAME,BOOKING_EVALUATION)
VALUES(:OLD.VOYAGES_ID,:OLD.CUSTOMER_NAME,:OLD.START_DATE,:OLD.SHIP_NAME,:OLD.BOOKING_EVALUATION);
END IF;
END;
这是我的审计表:
desc evaluationaudit;
Name Null? Type
----------------------------------------- -------- -----------------------
AUDITT_ID NOT NULL NUMBER(10)
VOYAGES_ID NOT NULL NUMBER(10)
CUSTOMER_NAME NOT NULL VARCHAR2(20)
START_DATE NOT NULL DATE
SHIP_NAME NOT NULL VARCHAR2(20)
BOOKING_EVALUATION NOT NULL NUMBER(20)
and this is my show error output:
SQL> SHOW ERRORS;
Errors for TRIGGER EVALUATION:
LINE/COL ERROR
-------- -------------------------------------------------------------
12/24 PLS-00049: bad bind variable 'NEW.CUSTOMER_NAME'
12/43 PLS-00049: bad bind variable 'NEW.START_DATE'
12/59 PLS-00049: bad bind variable 'NEW.SHIP_NAME'
18/24 PLS-00049: bad bind variable 'OLD.CUSTOMER_NAME'
18/43 PLS-00049: bad bind variable 'OLD.START_DATE'
18/59 PLS-00049: bad bind variable 'OLD.SHIP_NAME'
24/24 PLS-00049: bad bind variable 'OLD.CUSTOMER_NAME'
24/43 PLS-00049: bad bind variable 'OLD.START_DATE'
24/59 PLS-00049: bad bind variable 'OLD.SHIP_NAME'
我想添加到审计表中。如果客户对 2 或更少的差评,他们的航程详细信息(客户姓名、游轮名称和日期、船名和评估)但我收到错误
警告:触发器创建时出现编译错误。
审计表是空的,显示没有选择行。我似乎无法找到我出错的问题。
【问题讨论】:
-
只需在会话中输入
show errors或运行select * from user_errors;看起来很明显的错误是 1)您使用的是没有 into 子句的普通选择(第一个选择),这在 PL/SQL 中是不允许的。 2) 我没有看到声明的变量EVALUATIONAUDIT。摆脱选择,因为无论如何您都没有使用它。 -
无论您使用什么工具来开发 PL/SQL 代码,您确实需要了解如何使用它来显示编译错误,否则这将继续具有挑战性。如果这是 SQL*Plus,则在编译后立即使用
show errors,或者show errors trigger evaluation(其中evaluation是触发器的名称)。提供更多功能齐全的 IDE。 -
在上面我发现了错误并把它放在上面,但我不知道我哪里出错了。
-
您的
booking表没有这些列。 -
这些列来自 3 个表,如果预订评估小于 2 个,我想在审计表中输入这些表是客户表、船表和航次表。
标签: sql oracle triggers oracle12c database-trigger