PLS-00382:表达式的类型错误触发器
Posted
技术标签:
【中文标题】PLS-00382:表达式的类型错误触发器【英文标题】:PLS-00382: expression is of wrong type Trigger 【发布时间】:2015-12-13 03:21:34 【问题描述】:我正在尝试创建一个触发器,如果值是 'A'
用于存档或 'O'
用于打开,则仅允许插入或更新数据。每当我运行代码时,我都会收到一条消息说触发器编译时出错,然后我看到PLS-00382: expression is of the wrong type error
。
我不知道出了什么问题。之前,我使用||
运算符而不是OR
并且触发器编译时没有错误,但是即使状态设置为'O'
或'A'
,对表的任何更新仍会引发异常。我意识到||
与OR
不一样(我一直在使用Ruby,自己也很困惑)。任何帮助将不胜感激。我正在使用 Oracle SQL Developer 11g。
CREATE OR REPLACE TRIGGER before_status
BEFORE INSERT OR UPDATE OF status ON blog_post
FOR EACH ROW
BEGIN
IF :new.status != 'O' OR 'A' THEN
raise_application_error(-20101, 'Value must be A or O, cannot be anything else');
END IF;
END;
【问题讨论】:
您需要两个比较 (IF :new.status <> 'O' AND new.status <> 'A'
) 或使用一个集合 (if not new.status in ('A', 'O')
)。您现在编写的测试是 if new.status != ('O' OR 'A')
,并且 ('O' OR 'A') 是一个布尔值(True 或 False),这是对 new.status
的无效测试。这是基本的 SQL。
非常感谢肯的帮助。我不知道为什么我没有注意到我只有一个比较。将代码更改为以下内容后:IF :new.status != 'O' OR :new.status != 'A' ,触发器编译成功。
【参考方案1】:
在评论中回答了当前的问题。 if
的语法不正确:
IF :new.status not in ('O', 'A') THEN
不过,更重要的是,您不需要为此设置触发器。相反,只需使用 check
约束:
alter table blog_post add constraint chk_status check (status in ('0', 'A'));
【讨论】:
感谢您的输入 Gordon,我现在明白我在哪里犯了错误。我的审查说明说明要创建触发器,我什至没有想到要进行检查约束。谢谢你的建议,我真的很感激。以上是关于PLS-00382:表达式的类型错误触发器的主要内容,如果未能解决你的问题,请参考以下文章
PLS-00382:表达式类型错误,PL/SQL:语句被忽略
PL/SQL:PLS-00382:表达式类型错误。语句被忽略
PLS-00382:表达式类型错误,无法显示 DBMS_OUTPUT.PUT_LINE
ORA-06550:第 1 行,第 13 列:PLS-00382:表达式类型错误 ORA-06550:第 1 行,第 7 列:PL/SQL:语句被忽略