2016-03-31 46 views
0

我我的Oracle数据库上做了扳机,这里的代码PL/SQL的SQL * Plus语句忽略

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)'; 
+3

'IF:NEW.EVENT_ID AND:NEW.DESCRIPTION不为NULL THEN'是无效的sql语法。 – sagi

+0

错误消息指向第4行(从DECLARE开始计数,因为它是PL/SQL错误),这是sagi指向的行。它说*表达*是错误的类型,不是一个变量,所以不知道为什么你认为'group_ids'的类型是一个问题。 –

回答

0

该问题与触发器无关。您只需有一个语法错误在下面一行:

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; 
/
0

试试这个。

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;