標籤:
oracle 自訂異常~~ DECLAREv_ename emp.ename%TYPE;BEGINSELECT ename INTO v_ename FROM emp WHERE sal = &v_sal;dbms_output.put_line( ‘僱員名:‘ || v_ename);EXCEPTIONWHEN NO_DATA_FOUND THENdbms_output.put_line( ‘不存在工資為‘ || v_sal || ‘僱員‘);WHEN OTHERS THENdbms_output.put_line( ‘錯誤號碼‘ || SQLCODE );dbms_output.put_line( SQLERRM);END; -----------------------------------自訂異常處理
CREATE OR REPLACE PROCEDURE stu_proc
(
--多個用逗號隔開
v_id IN NUMBER
) IS
--多個用分號隔開
v_max_id NUMBER;
v_name VARCHAR2(20);
v_raise EXCEPTION;
BEGIN
SELECT MAX(a.id) INTO v_max_id FROM student a;
IF v_id>v_max_id THEN
RAISE v_raise;
END IF;
SELECT o.sname INTO v_name FROM student o WHERE o.id=v_id;
dbms_output.put_line(‘學生名稱為:‘||v_name);
EXCEPTION
WHEN v_raise THEN
RAISE_APPLICATION_ERROR(-20010, ‘v_id not exists!‘);
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20011, ‘ERROR:不存在!‘);
END stu_proc; 下面是常見的異常資訊:
--命名的系統異常 產生原因access_into_null 未定義對象case_not_found case中若未包含相應的when,並且沒有設定collection_is_null 集合元素未初始化curser_already_open 遊標已經開啟dup_val_on_index 唯一索引對應的列上有重複的值invalid_cursor 在不合法的遊標上進行操作invalid_number 內嵌的 sql 語句不能將字元轉換為數字 no_data_found 使用 select into 未返回行,或應用索引表未初始化的 too_many_rows 執行 select into 時,結果集超過一行zero_divide 除數為 0subscript_beyond_count 元素下標超過巢狀表格或varray的最大值subscript_outside_limit 使用巢狀表格或 varray 時,將下標指定為負數value_error 賦值時,變數長度不足以容納實際資料login_denied pl/sql 應用程式串連到 oracle 資料庫時,提供了不正確的使用者名稱或密碼 確的使用者名稱或密碼not_logged_on pl/sql 應用程式在沒有串連 oralce 資料庫的情況下訪問資料 問資料program_error pl/sql 內部問題,可能需要重裝資料字典& pl./sql系統包 統包rowtype_mismatch 主遊標變數與 pl/sql 遊標變數的傳回型別不相容self_is_null 使用物件類型時,在 null 對象上調用對象方法storage_error 運行 pl/sql 時,超出記憶體空間sys_invalid_id 無效的 rowid 字串timeout_on_resource oracle 在等待資源時逾時 ------------------------------------------------------------------------- 判斷一個字串是不是日期的函數: CREATE OR REPLACE FUNCTION f_is_date(parameter VARCHAR2 ) RETURN NUMBER IS
/*
判斷指定字串是否為日期
*/ val DATE;BEGIN val := TO_DATE(NVL(parameter, ‘a‘), ‘yyyy-mm-dd hh24:mi:ss‘ ); RETURN 1;EXCEPTION WHEN OTHERS THEN RETURN 0 ;END;
oracle自訂異常