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;
/
我正在我的 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;
/