双引号分隔的标识符错误SQL



大家好,我在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(精度、比例(。请参见此处。

您有一个没有ENDBEGIN,您可能希望使用: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;小提琴这里

相关内容

  • 没有找到相关文章

最新更新