大家好,我在oracle中遇到了这个错误
Errors: TRIGGER NOUPDATE
Line/Col: 9/5 PLS-00103: Encountered the symbol "IF" when expecting one of the following:
; <an identifier> <a double-quoted delimited-identifier>
这是代码:
CREATE OR REPLACE TRIGGER NoUpdate
BEFORE UPDATE OF apartmentsize ON rental
FOR EACH ROW
DECLARE
apartmentsize INT(22);
BEGIN
IF (apartmentsize < 60) THEN
BEGIN
RAISE_APPLICATION_ERROR(-20112,
'You cannot update the apartmentsize');
ROLLBACK;
END IF;
END;
/
我认为它在触发,但IF条件永远不成立。我看不出你在任何地方赋予公寓规模价值。
如果你认为是这样的话:
apartmentsize int(22);
那么不,这只是说armentsize被声明为一个22位数的整数。如果你想分配一个值:
apartmentsize int := 22;
根据18c SQL语言参考,"int"不是有效的数据类型。支持的数字数据类型包括:数字浮动二进制浮点二进制双
您想要的是NUMBER(精度、比例(。请参见此处。
您有一个没有END
的BEGIN
,您可能希望使用:NEW.apartmentsize
绑定变量来引用更新的值,而不是在触发器中声明一个变量:
CREATE OR REPLACE TRIGGER NoUpdate
BEFORE UPDATE OF apartmentsize ON rental
FOR EACH ROW
DECLARE
BEGIN
IF (:NEW.apartmentsize < 60) THEN
RAISE_APPLICATION_ERROR(
-20112,
'You cannot update the apartmentsize'
);
END IF;
END;
/
(注意:包括ROLLBACK
是没有意义的,因为引发异常将隐式触发回滚,并且一旦引发异常,触发器中的其余代码将不会被解析为引发了异常。(
然后,如果你有表格:
CREATE TABLE rental ( id, apartmentsize ) AS
SELECT 1, 100 FROM DUAL;
然后:
UPDATE rental
SET apartmentsize = 60
WHERE id = 1;
将工作,但:
UPDATE rental
SET apartmentsize = 59
WHERE id = 1;
将引发异常:
ORA-20112: You cannot update the apartmentsize ORA-06512: at "FIDDLE_DAVWBSJBRDBITOSDOROT.NOUPDATE", line 4 ORA-04088: error during execution of trigger 'FIDDLE_DAVWBSJBRDBITOSDOROT.NOUPDATE'
db<gt;小提琴这里