PL/SQL SQL*Plus 语句被忽略

PL/SQL SQL*Plus Statement Ignored

我正在我的 Oracle 数据库上执行触发器,这是代码

CREATE OR REPLACE TRIGGER send_telegram_message
AFTER INSERT ON EVENT_LOG
FOR EACH ROW
DECLARE 
  GROUP_IDS VARCHAR(200);
BEGIN
  IF :NEW.EVENT_ID AND :NEW.DESCRIPTION IS NOT NULL THEN

    SELECT ID_GRUPO INTO GROUP_IDS
    FROM V_EVENT_TELEGRAM 
    WHERE V_EVENT_TELEGRAM.EVENT_ID = :NEW.EVENT_ID;

    TELEGRAM_BOT(GROUP_IDS,:NEW.DESCRIPTION);
  END IF;
END;

编译时出现以下错误:

错误(4,3):PL/SQL:语句被忽略 错误(4,6):PLS-00382:表达式类型错误

问题似乎与 group_ids 变量的类型有关,我一直试图解决这个 PLS-00382 问题,但我不能。

"TELEGRAM_BOT()" 行是调用 Java 已发布方法的过程调用:

create or replace PROCEDURE telegram_bot (group_ids VARCHAR2, message VARCHAR2)
AS LANGUAGE JAVA 
NAME 'TelegramBot.subMain(String,String)';

试试这个。

CREATE OR REPLACE TRIGGER send_telegram_message
AFTER INSERT ON EVENT_LOG
FOR EACH ROW
DECLARE 
  GROUP_IDS VARCHAR(200);
BEGIN
  IF :NEW.EVENT_ID IS NOT  NULL AND :NEW.DESCRIPTION IS NOT NULL THEN

    SELECT ID_GRUPO INTO GROUP_IDS
    FROM V_EVENT_TELEGRAM 
    WHERE V_EVENT_TELEGRAM.EVENT_ID = :NEW.EVENT_ID;

    TELEGRAM_BOT(GROUP_IDS,:NEW.DESCRIPTION);
  END IF;
END;

问题与触发器无关。您只是在以下行中有语法错误:

IF :NEW.EVENT_ID AND :NEW.DESCRIPTION IS NOT NULL THEN

if statement 和逻辑运算符需要一个布尔表达式。 PL/SQL 没有到布尔值的隐式数据类型转换。

这意味着 :NEW.EVENT_ID 不是有效的布尔表达式,因此它不能与 and 运算符一起使用,因此编译失败:

PLS-00382: expression is of wrong type

基本上您的问题可以缩小到以下示例:

declare
  v_foo number;
begin
  -- compilation fails because a number (or any other non-boolean
  -- data type) is not a boolean expression.
  if v_foo
  then
    null;
  end if;
end;
/

工作示例(编译正常):

declare
  v_foo number;
  function to_boolean(p_x in number) return boolean is
  begin
    return p_x > 0;
  end;
begin
  -- a function returns a boolean value
  if to_boolean(v_foo)
  then
    null;
  end if;

  -- a > operator returns a boolean value
  if v_foo > 0
  then
    null;
  end if;

  -- is null operator returns a boolean value
  if v_foo is null
  then
    null;
  end if;
end;
/