2016-12-18 13 views
0

我想創建一個返回BOOLEAN的函數。 該函數將檢查值是否存在(典型驗證,如果一個部門已經存在)。ORACLE FUNCTION testcase

我實現了NO_DATA_FOUND異常,我也想添加WHEN OTHERS;但我沒有考慮任何測試用例。

下面是函數的代碼:

FUNCTION fnc_department_exists(p_dept_name hr.departments.department_name%TYPE) RETURN BOOLEAN IS 
    v_dummy PLS_INTEGER; 
BEGIN 
    -- Verifica existenta unui anumit departament 
    pkg_logging.prc_log('HR', 'VERIFIC', 'Verifica daca exista departamentul "' || p_dept_name || '"'); 
    SELECT 1 
    INTO v_dummy 
    FROM hr.departments 
    WHERE UPPER(department_name) = UPPER(p_dept_name); 

    pkg_logging.prc_log('HR', 'VERIFIC', 'Departamentul "' || p_dept_name || '" exista'); 

    RETURN TRUE; 
EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     pkg_logging.prc_log('HR', 'VERIFIC', 'Departamentul "' || p_dept_name || '" nu exista'); 
     RETURN FALSE; 
    WHEN OTHERS THEN 
     pkg_logging.prc_log('HR', 'VERIFIC', 'A aparut o alta eroare: ' || SQLCODE || ' - ' || SQLERRM); 
     RETURN FALSE; 
END fnc_department_exists; 

有人能提出一個測試用例WHEN OTHERS分支,好嗎?

謝謝

+0

總會有一些系統錯誤,例如損壞的索引塊,在這種情況下,您可能希望事情自然失敗,而不是報告部門不存在。同樣,如果你有機會重構你的日誌包,你可以自己選擇'sqlerrm'並將它捕獲到一個單獨的列中,而不需要開發人員將它與應用程序錯誤消息連接起來。而'sqlcode'在這裏沒有給你任何有用的信息 - 我會刪除它。 –

回答

0

如果您有一個名爲例如'PAYROLL',添加另一個名爲'Payroll'和另一個名爲'payroll'。這將導致SELECT失敗並出現ORA-01422(TOO_MANY_ROWS)異常。

我建議當你的代碼進入WHEN OTHERS塊時,你應該重新提升異常而不是吃掉它並返回false。因此:

WHEN OTHERS THEN 
    pkg_logging.prc_log('HR', 'VERIFIC', 'A aparut o alta eroare: ' || 
         SQLCODE || ' - ' || SQLERRM); 
    RAISE; 

祝你好運。

+0

條件WHERE UPPER(department_name)= UPPER(p_dept_name);'防止任何大小寫組合導致相同的值多次。 – mikcutu

+0

沒有GROUP BY子句或任何限制它返回多行的內容;因此,如果您的表中有DEPARTMENT_NAME值爲'PAYROLL','Payroll'和'payroll'的三行,則查詢將返回三行,使用'UPPER'將確保'UPPER('PAYROLL' )= UPPER('Payroll')= UPPER('payroll')'。例如[見這個小提琴](http://sqlfiddle.com/#!9/7f616/2) –

+0

我將從一個空表開始,並開始插入它,首先檢查部門名稱是否已經存在。 如果該表爲空,則第一次插入將正常工作,但第二次插入將失敗,因爲需求部門已存在於表中。 – mikcutu