2010-01-01 5 views

답변

7

SQLException에는 예외와 관련된 일부 데이터베이스 관련 정보가 들어 있습니다. 다큐먼트에서 :

1) 에러를 설명하는 캐릭터 :

되는 SQLException 각 정보 여러 가지를 제공한다. 이것은 Java Exception 메시지로 사용되며, getMesage 메소드를 통해 을 사용할 수 있습니다.

2) XOPEN SQLSTATE 규칙 또는 SQL 99 계속되는 "SQLstate" 문자열. SQLState 문자열의 값은 해당 사양에 설명되어 있습니다. DatabaseMetaData 메서드 getSQLStateType을 사용하면 XOPEN 유형 또는 SQL 99 유형을 이 반환하는지 여부를 확인할 수 있습니다.

3) 각 공급 업체 에 특정한 정수 오류 코드. 일반적으로 기본 데이터베이스에서 반환되는 실제 오류 코드는 입니다.

4) 다음으로 이어지는 체인 예외. 이것은 추가 오류 정보를 제공하는 데 사용할 수 있습니다.

4

브라이언 오른쪽에서 모든 JDBC 문제에 대해 SQLException이 발생합니다. 이것은 부분적으로 JDBC가 매우 성가신 이유입니다. Spring library JDBC helpersexception translator을 제공하여 SQLCode, SQLState 등을보고 적절한 DataAccessException을 던집니다. 이러한 예외 클래스에는 많은 것이 있으며, DataIntegrityViolationException, DataSourceLookupFailureException, PermissionDeniedDataAccessException 등과 같은 이름으로 무엇이 잘못되었는지 더 잘 이해할 수 있습니다.

+0

^훌륭한 자원 목록 ^. Spring이 제공해야 할 것이 너무 많아서 API의 모든 bi를 검토 할 시간이 있었으면 좋겠습니다. 어쨌든, 나는 또한 거기 던지기를 원했고, PK 나 FK가 같았고 삽입 할 수 없기 때문에 INSERT를 잠정적으로 가리키고있는 것처럼 들린다. 이 경우 DataIntegrityViolationException을 catch 할 수 있지만 더 적절한 핸들은 INSERT 대신 SQL MERGE 절을 사용하는 것입니다. http://en.wikipedia.org/wiki/Merge_(SQL) – Prancer

24

SQLException을 처리하는 최상의 DB 독립 방식은 SQLException#getSQLState()에서 얻을 수있는 SQL 상태 코드를 확인하는 것입니다. SQLState는 5 자 코드이며, 처음 두 개는 모든 DB에서 공통적이며 마지막 세 개는 DB 및/또는 특정 조건에 따라 다를 수 있습니다.

  • 02 : : 자료
  • 07
  • : 여기에 spec 추출물의 동적 SQL 오류가
  • 08 : 카디 위반
  • :
  • 21
  • 를 지원하지 않는 기능 : 예외
  • 0A 연결 22 : 데이터 예외
  • 23 : 무결성 제약 위반
  • 24 : 유효하지 않은 커서 상태
  • 25 : 유효하지 않은 트랜잭션 상태
  • 26 : 유효하지 않은 SQL 문 이름
  • 28 : 유효하지 않은 권한 부여 스펙
  • 2B : 의존 권한은 여전히 ​​존재 디스크립터
  • 2C : 잘못된 문자 집합 이름
  • 2D : 유효하지 않은 트랜잭션 종료
  • 2E : 잘못된 연결 이름
  • 33 : 잘못된 SQL 설명자 이름
  • ,
  • 34 : 유효하지 않은 커서 이름은
  • 35
  • : 수
  • 3C 무효 조건 : 모호한 커서 이름
  • 3D : 잘못된 카탈로그 이름
  • 3 층 : 유효하지 않은 스키마 이름 그래서

가 있는지 여부를 확인하기 위해 SQL 예외는 제약 조건 위반으로 인해 발생하므로 클래스에서 다음을 수행 할 수 있습니다.

public static boolean isConstraintViolation(SQLException e) { 
    return e.getSQLState().startsWith("23"); 
} 
+0

내 예외에서 내 새 행이 특정 제약 조건을 위반한다는 내용의 자세한 메시지가 표시 될 수 있지만 'e.getSQLState()'메시지를 커스터마이징하기 위해서 항상 null 값을 얻는다. 이것을 극복 할 수있는 방법이 있습니까? – Pere

2

BalusC's answer을 추적하면 다음은 SQL : 2011 표준에 지정된 모든 클래스 및 하위 클래스의 최신 목록입니다. 방금 최근에 Javadoc of jOOQ's SQLStateSubclass에 대한 목록을 작성했습니다. 당신이 저장 프로 시저 또는 함수와 함께 작업 할 때

+----+-----------------------------------------------------------+-----+--------------------------------------------------------------+ 
| Class and class description         | Subclass and subclass description         | 
+----+-----------------------------------------------------------+-----+--------------------------------------------------------------+ 
| 00 | Successful completion          | 000 | No subclass             | 
| 01 | Warning             | 000 | No subclass             | 
| 01 | Warning             | 001 | Cursor operation conflict         | 
| 01 | Warning             | 002 | Disconnect error            | 
| 01 | Warning             | 003 | Null value eliminated in set function      | 
| 01 | Warning             | 004 | String data, right truncation        | 
| 01 | Warning             | 005 | Insufficient item descriptor areas       | 
| 01 | Warning             | 006 | Privilege not revoked          | 
| 01 | Warning             | 007 | Privilege not granted          | 
| 01 | Warning             | 009 | Search condition too long for information schema    | 
| 01 | Warning             | 00A | Query expression too long for information schema    | 
| 01 | Warning             | 00B | Default value too long for information schema    | 
| 01 | Warning             | 00C | Result sets returned           | 
| 01 | Warning             | 00D | Additional result sets returned        | 
| 01 | Warning             | 00E | Attempt to return too many result sets      | 
| 01 | Warning             | 00F | Statement too long for information schema     | 
| 01 | Warning             | 012 | Invalid number of conditions         | 
| 01 | Warning             | 02F | Array data, right truncation         | 
| 02 | No data             | 000 | No subclass             | 
| 02 | No data             | 001 | No additional result sets returned       | 
| 07 | Dynamic SQL Error           | 000 | No subclass             | 
| 07 | Dynamic SQL Error           | 001 | Using clause does not match dynamic parameter specifications | 
| 07 | Dynamic SQL Error           | 002 | Using clause does not match target specifications   | 
| 07 | Dynamic SQL Error           | 003 | Cursor specification cannot be executed      | 
| 07 | Dynamic SQL Error           | 004 | Using clause required for dynamic parameters     | 
| 07 | Dynamic SQL Error           | 005 | Prepared statement not a cursor specification    | 
| 07 | Dynamic SQL Error           | 006 | Restricted data type attribute violation      | 
| 07 | Dynamic SQL Error           | 007 | Using clause required for result fields      | 
| 07 | Dynamic SQL Error           | 008 | Invalid descriptor count          | 
| 07 | Dynamic SQL Error           | 009 | Invalid descriptor index          | 
| 07 | Dynamic SQL Error           | 00B | Data type transform function violation      | 
| 07 | Dynamic SQL Error           | 00C | Undefined DATA value           | 
| 07 | Dynamic SQL Error           | 00D | Invalid DATA target           | 
| 07 | Dynamic SQL Error           | 00E | Invalid LEVEL value           | 
| 07 | Dynamic SQL Error           | 00F | Invalid DATETIME_INTERVAL_CODE        | 
| 08 | Connection exception          | 000 | No subclass             | 
| 08 | Connection exception          | 001 | SQL-client unable to establish SQL-connection    | 
| 08 | Connection exception          | 002 | Connection name in use          | 
| 08 | Connection exception          | 003 | Connection does not exist         | 
| 08 | Connection exception          | 004 | SQL-server rejected establishment of SQL-connection   | 
| 08 | Connection exception          | 006 | Connection failure           | 
| 08 | Connection exception          | 007 | Transaction resolution unknown        | 
| 09 | Triggered action exception        | 000 | No subclass             | 
| 0A | Feature not supported          | 000 | No subclass             | 
| 0A | Feature not supported          | 001 | Multiple server transactions         | 
| 0D | Invalid target type specification       | 000 | No subclass             | 
| 0E | Invalid schema name list specification     | 000 | No subclass             | 
| 0F | Locator exception           | 000 | No subclass             | 
| 0F | Locator exception           | 001 | Invalid specification          | 
| 0L | Invalid grantor           | 000 | No subclass             | 
| 0M | Invalid SQL-invoked procedure reference     | 000 | No subclass             | 
| 0P | Invalid role specification        | 000 | No subclass             | 
| 0S | Invalid transform group name specification    | 000 | No subclass             | 
| 0T | Target table disagrees with cursor specification   | 000 | No subclass             | 
| 0U | Attempt to assign to non-updatable column     | 000 | No subclass             | 
| 0V | Attempt to assign to ordering column      | 000 | No subclass             | 
| 0W | Prohibited statement encountered during trigger execution | 000 | No subclass             | 
| 0W | Prohibited statement encountered during trigger execution | 001 | Modify table modified by data change delta table    | 
| 0Z | Diagnostics exception          | 000 | No subclass             | 
| 0Z | Diagnostics exception          | 001 | Maximum number of stacked diagnostics areas exceeded   | 
| 21 | Cardinality violation          | 000 | No subclass             | 
| 22 | Data exception           | 000 | No subclass             | 
| 22 | Data exception           | 001 | String data, right truncation        | 
| 22 | Data exception           | 002 | Null value, no indicator parameter       | 
| 22 | Data exception           | 003 | Numeric value out of range         | 
| 22 | Data exception           | 004 | Null value not allowed          | 
| 22 | Data exception           | 005 | Error in assignment           | 
| 22 | Data exception           | 006 | Invalid interval format          | 
| 22 | Data exception           | 007 | Invalid datetime format          | 
| 22 | Data exception           | 008 | Datetime field overflow          | 
| 22 | Data exception           | 009 | Invalid time zone displacement value       | 
| 22 | Data exception           | 00B | Escape character conflict         | 
| 22 | Data exception           | 00C | Invalid use of escape character        | 
| 22 | Data exception           | 00D | Invalid escape octet           | 
| 22 | Data exception           | 00E | Null value in array target         | 
| 22 | Data exception           | 00F | Zero-length character string         | 
| 22 | Data exception           | 00G | Most specific type mismatch         | 
| 22 | Data exception           | 00H | Sequence generator limit exceeded       | 
| 22 | Data exception           | 00P | Interval value out of range         | 
| 22 | Data exception           | 00Q | Multiset value overflow          | 
| 22 | Data exception           | 010 | Invalid indicator parameter value       | 
| 22 | Data exception           | 011 | Substring error            | 
| 22 | Data exception           | 012 | Division by zero            | 
| 22 | Data exception           | 013 | Invalid preceding or following size in window function  | 
| 22 | Data exception           | 014 | Invalid argument for NTILE function       | 
| 22 | Data exception           | 015 | Interval field overflow          | 
| 22 | Data exception           | 016 | Invalid argument for NTH_VALUE function      | 
| 22 | Data exception           | 018 | Invalid character value for cast        | 
| 22 | Data exception           | 019 | Invalid escape character          | 
| 22 | Data exception           | 01B | Invalid regular expression         | 
| 22 | Data exception           | 01C | Null row not permitted in table        | 
| 22 | Data exception           | 01E | Invalid argument for natural logarithm      | 
| 22 | Data exception           | 01F | Invalid argument for power function       | 
| 22 | Data exception           | 01G | Invalid argument for width bucket function     | 
| 22 | Data exception           | 01H | Invalid row version           | 
| 22 | Data exception           | 01S | Invalid XQuery regular expression       | 
| 22 | Data exception           | 01T | Invalid XQuery option flag         | 
| 22 | Data exception           | 01U | Attempt to replace a zero-length string      | 
| 22 | Data exception           | 01V | Invalid XQuery replacement string       | 
| 22 | Data exception           | 01W | Invalid row count in fetch first clause      | 
| 22 | Data exception           | 01X | Invalid row count in result offset clause     | 
| 22 | Data exception           | 020 | Invalid period value           | 
| 22 | Data exception           | 021 | Character not in repertoire         | 
| 22 | Data exception           | 022 | Indicator overflow           | 
| 22 | Data exception           | 023 | Invalid parameter value          | 
| 22 | Data exception           | 024 | Unterminated C string          | 
| 22 | Data exception           | 025 | Invalid escape sequence          | 
| 22 | Data exception           | 026 | String data, length mismatch         | 
| 22 | Data exception           | 027 | Trim error             | 
| 22 | Data exception           | 029 | Noncharacter in UCS string         | 
| 22 | Data exception           | 02D | Null value substituted for mutator subject parameter   | 
| 22 | Data exception           | 02E | Array element error           | 
| 22 | Data exception           | 02F | Array data, right truncation         | 
| 22 | Data exception           | 02G | Invalid repeat argument in sample clause      | 
| 22 | Data exception           | 02H | Invalid sample size           | 
| 23 | Integrity constraint violation       | 000 | No subclass             | 
| 23 | Integrity constraint violation       | 001 | Restrict violation           | 
| 24 | Invalid cursor state          | 000 | No subclass             | 
| 25 | Invalid transaction state         | 000 | No subclass             | 
| 25 | Invalid transaction state         | 001 | Active SQL-transaction          | 
| 25 | Invalid transaction state         | 002 | Branch transaction already active       | 
| 25 | Invalid transaction state         | 003 | Inappropriate access mode for branch transaction    | 
| 25 | Invalid transaction state         | 004 | Inappropriate isolation level for branch transaction   | 
| 25 | Invalid transaction state         | 005 | No active SQL-transaction for branch transaction    | 
| 25 | Invalid transaction state         | 006 | Read-only SQL-transaction         | 
| 25 | Invalid transaction state         | 007 | Schema and data statement mixing not supported    | 
| 25 | Invalid transaction state         | 008 | Held cursor requires same isolation level     | 
| 26 | Invalid SQL statement name        | 000 | No subclass             | 
| 27 | Triggered data change violation       | 000 | No subclass             | 
| 27 | Triggered data change violation       | 001 | Modify table modified by data change delta table    | 
| 28 | Invalid authorization specification      | 000 | No subclass             | 
| 2B | Dependent privilege descriptors still exist    | 000 | No subclass             | 
| 2C | Invalid character set name        | 000 | No subclass             | 
| 2C | Invalid character set name        | 001 | Cannot drop SQL-session default character set    | 
| 2D | Invalid transaction termination       | 000 | No subclass             | 
| 2E | Invalid connection name         | 000 | No subclass             | 
| 2F | SQL routine exception          | 000 | No subclass             | 
| 2F | SQL routine exception          | 002 | Modifying SQL-data not permitted        | 
| 2F | SQL routine exception          | 003 | Prohibited SQL-statement attempted       | 
| 2F | SQL routine exception          | 004 | Reading SQL-data not permitted        | 
| 2F | SQL routine exception          | 005 | Function executed no return statement      | 
| 2H | Invalid collation name         | 000 | No subclass             | 
| 30 | Invalid SQL statement identifier       | 000 | No subclass             | 
| 33 | Invalid SQL descriptor name        | 000 | No subclass             | 
| 34 | Invalid cursor name          | 000 | No subclass             | 
| 35 | Invalid condition number         | 000 | No subclass             | 
| 36 | Cursor sensitivity exception        | 000 | No subclass             | 
| 36 | Cursor sensitivity exception        | 001 | request rejected            | 
| 36 | Cursor sensitivity exception        | 002 | request failed            | 
| 38 | External routine exception        | 000 | No subclass             | 
| 38 | External routine exception        | 001 | Containing SQL not permitted         | 
| 38 | External routine exception        | 002 | Modifying SQL-data not permitted        | 
| 38 | External routine exception        | 003 | Prohibited SQL-statement attempted       | 
| 38 | External routine exception        | 004 | Reading SQL-data not permitted        | 
| 39 | External routine invocation exception      | 000 | No subclass             | 
| 39 | External routine invocation exception      | 004 | Null value not allowed          | 
| 3B | Savepoint exception          | 000 | No subclass             | 
| 3B | Savepoint exception          | 001 | Invalid specification          | 
| 3B | Savepoint exception          | 002 | Too many              | 
| 3C | Ambiguous cursor name          | 000 | No subclass             | 
| 3D | Invalid catalog name          | 000 | No subclass             | 
| 3F | Invalid schema name          | 000 | No subclass             | 
| 40 | Transaction rollback          | 000 | No subclass             | 
| 40 | Transaction rollback          | 001 | Serialization failure          | 
| 40 | Transaction rollback          | 002 | Integrity constraint violation        | 
| 40 | Transaction rollback          | 003 | Statement completion unknown         | 
| 40 | Transaction rollback          | 004 | Triggered action exception         | 
| 42 | Syntax error or access rule violation      | 000 | No subclass             | 
| 44 | With check option violation        | 000 | No subclass             | 
| HZ | Remote database access         | 000 | No subclass             | 
+----+-----------------------------------------------------------+-----+--------------------------------------------------------------+ 
0

은 또한 특히 유용 제대로 예외를 처리하는 getErrorCode() 방법을 사용할 수 있습니다 그리고 당신은 당신 자신의 사용자 지정 오류 코드를 가지고있다.

비슷한 맥락의 사람에게 도움이 될 수 있습니다.

0

catch 절에서 더 구체적으로 해당 Exception을 처리 할 수 ​​있습니다.

try { 

// Your code here 

} catch(SQLException ex){ 
    if(ex instanceof SQLIntegrityConstraintViolationException) { 
      // Handle Here 
    } 
} 
+1

일반적으로 if를 사용하는 대신 특정 추가 catch 절을 사용하는 것이 좋습니다. –

+0

물론 나는 설탕을 더했다, 당신은 차를 더하는 것에 끝내 준다! 그러나 나는이 방법을 선호합니다. 왜냐하면'보통'예외를 사용하기 전에 일반적으로 일반적인 예외를 사용하기 때문에 내게는 유지 보수가 가능하지만 선택은 항상 개발자에게 달려 있기 때문입니다. –

관련 문제