Oracle Error code
標準的 SQLException 提供了一個標準化的資訊段 (SQLState) 和一個供應商特有的資訊段 (ErrorCode)。正如大多數的資料庫和它們的 JDBC 驅動程式實現一樣,Oracle 資料庫和 JDBC 驅動程式通過供應商特有的錯誤碼所提供的關於問題的詳細資訊要比通過 SQLException 的與供應商無關的 SQLState 元件所提供的資訊多得多。
Oracle 資料庫及其 JDBC 驅動程式通過 Error Code 提供的更豐富得多的詳細資訊的一個明顯的例子是 SQLState 程式碼 42000 (通常這指示語法錯誤或訪問問題)。對於 Oracle JDBC 驅動程式的大量不同的 Oracle 錯誤碼,SQLException 都將返回相同的 SQLState 值 (42000)。對應 SQLState 的 42000 值的一些 Oracle 錯誤碼包括 900(“無效 SQL 語句”)、903(“無效表名”)、904(“無效識別符號”)、911(“無效字元”)和 936(“缺少表示式”)。此外很明顯任何來源於 Oracle JDBC 驅動程式的錯誤(與來源於 Oracle 資料庫的錯誤相反)都沒有任何對應的 SQLState。正如這些例子所顯示那樣,Oracle 特有的錯誤碼所提供的關於錯誤情況的詳細資訊要比與供應商無關的 SQLState 所提供的資訊更豐富得多。
有時候區分來源於 Oracle 資料庫的錯誤和來源於 Oracle JDBC 驅動程式的錯誤非常重要。例如,903(“無效的表名”)錯誤碼對應 Oracle 資料庫錯誤碼 ORA-00903。相反,17003(“無效的列索引”)錯誤碼對應 Oracle JDBC 驅動程式錯誤碼 ORA-17003。這兩種型別的錯誤碼(資料庫和 JDBC 驅動程式)都是 Oracle 特有的(如 ORA- 字首所指示的那樣)。因為沒有為來源於 Oracle JDBC 驅動程式的錯誤提供 SQLState 錯誤碼,因此必須使用 Oracle 特有的錯誤碼來區分由 JDBC 驅動程式導致的錯誤。
在下面的表 1 中列出了訪問 Oracle 資料庫的 JDBC 中的一些最常見的錯誤。“示例程式碼和/或註釋”列中的示例顯示了導致這種錯誤的 SQL 語句型別或提供了關於表中的該行上顯示的特定錯誤的其他註釋。
表 1
錯誤標記 Oracle 錯誤 SQLState 示例程式碼和/或註釋
基於語句:SELECT ename FROM emp 變種的 SQL 相關錯誤
“唯一性約束” 1 2300 例如主鍵違規
“資源忙且指定 NOWAIT 獲取資源”
54 61000 只有在指定了 NOWAIT 時才出現
“無效的 SQL 語句”
900 42000 ename FROM emp
“無效的表名”
903 42000 SELECT ename FROM
“無效的識別符號”
904 42000 SELECT empname FROM emp
“無效的字元”
911 42000 SELECT ename FROM emp;
“缺少列”
917 42000 在 INSERT 語句中需要逗號來分隔列時遺漏逗號可能是一個原因。
“在期望的位置沒有找到 FROM 關鍵字”
923 42000 SELECT ename emp
“缺少表示式”
936 42000 SELECT FROM emp
“表或檢視不存在”
942 42000 SELECT ename FROM empp
“不能插入空值”
1400 23000 試圖向包含 NOT NULL 約束的列中插入空值
“值大於該列的指定精度”
1438 22003 試圖插入比列允許的精度更多的數字位數
“無效的數字”
1722 42000 試圖對字元執行數值函式
“完整性約束失敗”
2291 23000 試圖插入包含與現有主鍵不匹配的外來鍵的行
“值太大,”
12899 72000 試圖插入超出列允許範圍的的值(例如過多的字元)
“Io 異常”
17002 無 來源於 Oracle JDBC 驅動程式的錯誤沒有對應的 SQLState (null)
“無效的列索引”
17003 無
“無效的列名”
17006 無
“數值溢位”
17026 無