2013-02-25 46 views
2

我在mysql db中有幾百個觸發器,我正在遷移到Oracle db。有一個聲明,我看到很多,我沒有能夠在oracle中找到相同的一個。Oracle等效於MySQL代碼「insert into dummy」以返回錯誤消息

INSERT INTO $some_kind_of_message._BD_TRIGG$ (dummy) VALUES (value); 

我也看到了這個過程和函數,它似乎「迴歸」的消息給誰調用的程序(我認爲)的aplication。我在兩種RDBMS中都有新的功能,但我已經與oracle一起工作了幾個月。

是否有一個等效的語句來取代oracle中的mysql?非常感謝。

編輯:

這是許多的例子觸發。這一個用於登錄驗證。 我不太確定oracle的觸發器語法,但現在不是問題所在。 'case'部分仍然是mysql語法。我還沒有能夠找到信息在MySQL和Oracle文檔。這不是一個正常的插入,它是某種返回消息 MySQL使用(多數民衆贊成我猜),我也看到它的功能和程序。 ¿我如何將它替換爲oracle來執行相同的任務?

CREATE OR REPLACE TRIGGER adduser 
BEFORE INSERT 
ON tbl_users 
FOR EACH ROW 

    DECLARE flag INTEGER; 

    begin 
    flag := 1; 

    /* validate login */ 
    IF(LENGTH(TRIM(:NEW.login)) < 4) THEN 
    flag := -1; 
    END IF; 

    /* valido clave */ 
    IF(flag = 1) THEN 
    IF(LENGTH(:NEW.clave) < 3) THEN 
     flag := -2; 
    END IF; 
    END IF; 
    CASE flag 
     WHEN -1 THEN INSERT INTO $login_less_then_4_characters._BD_TRIGG$ (dummy) VALUES ('error'); 
     WHEN -2 THEN INSERT INTO $pass_less_then_5_characters._BD_TRIGG$ (dummy) VALUES ('error'); 
     ELSE flag := 0; 
    END CASE; 
END; 
+0

我不相信,一個Oracle觸發器可以返回一個值。如果它拋出一個將被返回的異常。如果你想創建事務表或者其他類型的東西,你總是可以從觸發器內插入另一個表。 – jfin3204 2013-02-25 19:49:26

+0

Oracle有適當的異常處理。沒有必要爲了「發送」消息而產生錯誤 – 2013-02-25 23:15:13

回答

2

我認爲你需要RAISE_APPLICATION_ERROR()函數/過程。

語法:

raise_application_error(error code, your error message); 

實施例:

raise_application_error(-20001, 'Login must have 4 characters or more'); 

在Oracle定製aplication錯誤碼是-20000-20999之間。

點擊此處瞭解詳情:

Oracle PL/SQL - Raise User-Defined Exception With Custom SQLERRM

Oracle文檔:link

+0

我會看看這些例子。 – 2013-02-25 22:34:02

+0

@AlejandroBastidas我添加了一些信息。我不是甲骨文的專家,但這一行應該沒有任何聲明。 – Kamil 2013-02-25 22:38:25

0

我不熟悉MySQL的語法,但在甲骨文它翻譯爲

Insert into table_name(column_name) VALUES (value); 

其中假人在一些表格或參數傳遞給函數的一列。您不能在Oracle中的Insert語句中使用過程和觸發器。您可以在DML語句中使用Function(),例如SELECT your_function(dummy)...,INSERT your_function(dummy)...函數返回一個值,我們都知道。

+0

也許我沒有讓自己清楚。讓我編輯這個問題。 – 2013-02-25 21:16:29