2013-09-27 64 views
1

我的腳本如下所示,它會將一個csv文件加載到PRODUCT_TBL,並且在該過程中發生任何錯誤,腳本將回滾事務並輸出一條錯誤消息,但它不會打印出消息時它遇到UTL_FILE錯誤,例如無效的文件操作。任何幫助表示讚賞。由於Oracle PLSQL - UTL_FILE中的錯誤處理

DECLARE 
    V_error_code NUMBER; 
    V_error_message VARCHAR2(255); 
    V_ignore_headerlines NUMBER := 1; 
    V_eof BOOLEAN := FALSE; 
    F UTL_FILE.FILE_TYPE; 
    V_LINE VARCHAR2 (32767); 
    V_PRD_ID PRODUCT_TBL.PRD_ID%TYPE; 
    V_PATTERN PRODUCT_TBL.PATTERN%TYPE; 
    V_REMARK PRODUCT_TBL.REMARK%TYPE; 
    V_CREATED_BY PRODUCT_TBL.CREATED_BY%TYPE; 
    V_CREATED_DATE PRODUCT_TBL.CREATED_DATE%TYPE; 
    V_MODIFIED_BY PRODUCT_TBL.MODIFIED_BY%TYPE; 
    V_MODIFIED_DATE PRODUCT_TBL.MODIFIED_DATE%TYPE; 
BEGIN 
    F := UTL_FILE.FOPEN ('DATA_DIR', 'PRODUCT_TBLv51.csv', 'R'); 
    IF V_ignore_headerlines > 0 
    THEN 
    BEGIN 
     FOR i IN 1 .. V_ignore_headerlines 
     LOOP 
     UTL_FILE.get_line(F, V_LINE); 
     END LOOP; 
    EXCEPTION 
     WHEN NO_DATA_FOUND 
     THEN 
     V_eof := TRUE; 
    END; 
    END IF; 

    WHILE NOT V_eof 
    LOOP 
    BEGIN 
     UTL_FILE.GET_LINE(F, V_LINE, 32767); 
     IF V_LINE IS NULL THEN 
     EXIT; 
     END IF; 
     V_PRD_ID := REGEXP_SUBSTR(V_LINE, '([^,\(]*(\([^\)]*\)[^,\(]*)*)(,|$)', 1, 1, 'i', 1); 
     V_PATTERN := REGEXP_SUBSTR(V_LINE, '([^,\(]*(\([^\)]*\)[^,\(]*)*)(,|$)', 1, 2, 'i', 1); 
     V_REMARK := REGEXP_SUBSTR(V_LINE, '([^,\(]*(\([^\)]*\)[^,\(]*)*)(,|$)', 1, 12, 'i', 1); 
     V_CREATED_BY := REGEXP_SUBSTR(V_LINE, '([^,\(]*(\([^\)]*\)[^,\(]*)*)(,|$)', 1, 13, 'i', 1); 
     V_CREATED_DATE := REGEXP_SUBSTR(V_LINE, '([^,\(]*(\([^\)]*\)[^,\(]*)*)(,|$)', 1, 14, 'i', 1); 
     V_MODIFIED_BY := REGEXP_SUBSTR(V_LINE, '([^,\(]*(\([^\)]*\)[^,\(]*)*)(,|$)', 1, 15, 'i', 1); 
     V_MODIFIED_DATE := REGEXP_SUBSTR(V_LINE, '([^,\(]*(\([^\)]*\)[^,\(]*)*)(,|$)', 1, 16, 'i', 1); 
     INSERT INTO PRODUCT_TBL (PRD_ID,PATTERN,REMARK,CREATED_BY,CREATED_DATE,MODIFIED_BY,MODIFIED_DATE) 
     VALUES(V_PRD_ID, V_PATTERN, V_REMARK, V_CREATED_BY, V_CREATED_DATE, V_MODIFIED_BY, V_MODIFIED_DATE); 
    EXCEPTION 
     WHEN OTHERS THEN 
     ROLLBACK; 
     v_error_code := SQLCODE; 
     v_error_message := SQLERRM; 
     dbms_output.put_line(v_error_code || SQLERRM); 
     EXIT; 
    END; 
    END LOOP; 

    COMMIT; 
    UTL_FILE.FCLOSE(F); 

EXCEPTION 
    WHEN UTL_FILE.INVALID_OPERATION THEN 
    UTL_FILE.FCLOSE(F); 
    dbms_output.put_line('File could not be opened or operated on as requested.'); 
END; 
/

回答

0

UTL_FILE部分後面加一個EXCEPTION ... OTHER塊,看看什麼樣的異常真正去throuhg趕上他們。

EXCEPTION 
    WHEN UTL_FILE.INVALID_OPERATION THEN 
    UTL_FILE.FCLOSE(F); 
    dbms_output.put_line('File could not be opened or operated on as requested.'); 
    WHEN OTHERS THEN 
    dbms_output.put_line('other trouble'||SQLCODE||SQLERRM); 

當你知道發生了哪一個你會知道如何捕捉它。

+0

這是'當其他人',而不是'當其他'。 –

+0

@LukeWoodward是的。謝謝。 –