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:语句被忽略

将值插入记录类型表

为啥`SYS.odcivarchar2list`不能与`PIPELINED`函数一起使用