2016-03-31 43 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;