SQLState 90006

842 views
Skip to first unread message

cowwoc

unread,
Apr 1, 2011, 7:49:14 PM4/1/11
to H2 Database
Hi,

When I attempt to insert a record and omit a value for a column
defined as NOT NULL, H2 throws an SQLException with SQLState == 90006.

Instead of defining a proprietary SQLState, shouldn't it reuse 23502
which is defined as "An insert or update value is null, but the column
cannot contain null values"?

Thanks,
Gili

Thomas Mueller

unread,
Apr 4, 2011, 1:41:15 PM4/4/11
to h2-da...@googlegroups.com
Hi,

Thanks! Yes, some of the SQL states are not compatible with other
databases. I will change:

From 90005 to 22001: "Value too long for column ...: ...".
From 90039 to 22003: "The value is too large for the precision
..." is merged with "Numeric value out of range".
From 90110 to 22003: "... out of range" is merged with "Numeric
value out of range".
From 90021 to 22018: "Data conversion error converting ...".
From 90006 to 23502: "NULL not allowed for column ...".
From 23003 to 23503: "Referential integrity constraint violation: ...".
From 23001 to 23505: "Unique index or primary key violation: ...".
From 23002 to 23506: "Referential integrity constraint violation: ...".
From 90056 to 23507: "No default value is set for column ...".
From 23000 to 23513: "Check constraint violation: ...".
From 08004 to 28000: "Wrong user name or password".
From 90051 to 57014: "Statement was canceled or the session timed out".

Regards,
Thomas

cowwoc

unread,
Apr 4, 2011, 2:06:51 PM4/4/11
to h2-da...@googlegroups.com
Hi Thomas,

How will I know when this fix is committed? Is there a specific bug
report or release version I should watch?

Thanks,
Gili

Thomas Mueller

unread,
Apr 6, 2011, 4:37:39 PM4/6/11
to h2-da...@googlegroups.com
Hi,

>    How will I know when this fix is committed? Is there a specific bug
> report or release version I should watch?

The change is included in the version 1.3.154.

Regards,
Thomas

cowwoc

unread,
Apr 10, 2011, 1:09:53 AM4/10/11
to H2 Database
Hi Thomas,

When I attempt to insert data that violates a foreign key using
1.3.154 I now get this exception:

org.h2.jdbc.JdbcSQLException: Referential integrity constraint
violation: "CONSTRAINT_5E47: PUBLIC.QUEUE_DOCTORS FOREIGN
KEY(DOCTOR_ID) REFERENCES PUBLIC.DOCTORS(ID)"; SQL statement:
insert into QUEUE_DOCTORS(DOCTOR_ID, QUEUE_ID)
values (?, ?) [23506-154]

I couldn't any find any reliable explanation for SQLState 23506 (where
did you find it?) but I did notice that SQLState 23503 is defined as
"The insert or update value of a foreign key is invalid". Shouldn't H2
use SQLState 23503 in this case?

Thanks,
Gili

On Apr 6, 4:37 pm, Thomas Mueller <thomas.tom.muel...@gmail.com>
wrote:

cowwoc

unread,
Apr 10, 2011, 1:24:42 AM4/10/11
to H2 Database
I also can't find information about SQLState 23507. Isn't SQLState
23502 "An insert or update value is null, but the column cannot
contain null values" more appropriate in this case?

Thanks,
Gili

Thomas Mueller

unread,
Apr 10, 2011, 2:24:27 PM4/10/11
to h2-da...@googlegroups.com

Hi,

It's possible that the SQL state is still incorrect, I will check in about two weeks.

Regards,
Thomas

> --
> You received this message because you are subscribed to the Google Groups "H2 Database" group.
> To post to this group, send email to h2-da...@googlegroups.com.
> To unsubscribe from this group, send email to h2-database...@googlegroups.com.
> For more options, visit this group at http://groups.google.com/group/h2-database?hl=en.
>

Thomas Mueller

unread,
Apr 28, 2011, 4:44:38 PM4/28/11
to h2-da...@googlegroups.com
Hi,

> I couldn't any find any reliable explanation for SQLState 23506

H2 uses two error codes (23503 and 23506) for referential integrity violation:

REFERENTIAL_INTEGRITY_VIOLATED_CHILD_EXISTS_1 = 23503;
REFERENTIAL_INTEGRITY_VIOLATED_PARENT_MISSING_1 = 23506;

This was requested by a user some time ago, so he can distinguish
between missing parent and missing child row. The error message itself
is the same. Maybe it would be "better" to use the same SQL state, but
different error codes. However, if possible I would like to keep an
1:1 mapping.

>> I also can't find information about SQLState 23507. Isn't SQLState
>> 23502 "An insert or update value is null, but the column cannot
>> contain null values" more appropriate in this case?

Are SQL states really standardized to the last digit? When searching
for "sqlstate 23503" in Google, I find IBM DB2 documentation, but no
link to any standard.

Regards,
Thomas

cowwoc

unread,
Apr 28, 2011, 5:46:41 PM4/28/11
to h2-da...@googlegroups.com

I was under the impression that all standard SQLState codes are
defined by the SQL standard. Are they not? Who has the final word when
it comes to SQLState values?

PS: I would prefer using the same SQLState with two different codes. IBM
does the same in many places for DB2.

Gili

Nitin

unread,
May 1, 2011, 2:34:35 PM5/1/11
to H2 Database
Hi,

I found this link helpful. see next chapters for standard SQLSTATE
codes:
http://kb.askmonty.org/v/sqlstate-codes

Nitin

Thomas Mueller

unread,
May 1, 2011, 2:38:25 PM5/1/11
to h2-da...@googlegroups.com
Hi,

> I was under the impression that all standard SQLState codes are defined
> by the SQL standard. Are they not?

I don't know. At least I can't find it in the standard.

> Who has the final word when it comes to SQLState values?

I guess nobody and everybody.

> PS: I would prefer using the same SQLState with two different codes. IBM
> does the same in many places for DB2.

Please note other databases (Oracle, MS SQL Server, MySQL,
PostgreSQL,...) are also not fully compatible with each other or with
DB2 in this regard.

I will leave the SQL states as is currently. If you have a very
convincing use case I might change my mind.

Regards,
Thomas

cowwoc

unread,
May 3, 2011, 8:44:56 PM5/3/11
to H2 Database
Thomas,

Can you please explain the difference (perhaps give an example)
between a missing parent and missing child row error? I'm not sure
what exactly that refers to.

Thanks,
Gili

On Apr 28, 4:44 pm, Thomas Mueller <thomas.tom.muel...@gmail.com>
wrote:
> for "sqlstate23503" in Google, I find IBM DB2 documentation, but no

Thomas Mueller

unread,
May 4, 2011, 3:36:06 PM5/4/11
to h2-da...@googlegroups.com

cowwoc

unread,
May 4, 2011, 6:16:53 PM5/4/11
to H2 Database
Hi Thomas,

I noticed that H2 defines SQLState 21002 but this is not listed by
http://kb.askmonty.org/v/no-data-sqlstates (which leads me to believe
it is non-standard) yet the number being used is supposed to be
standard.

Either http://kb.askmonty.org/v/no-data-sqlstates is not a reliable
source for standard SQLStates, or H2 is hijacking reserved numbers.
What do you think?

Gili

On May 4, 3:36 pm, Thomas Mueller <thomas.tom.muel...@gmail.com>
wrote:

cowwoc

unread,
May 4, 2011, 11:33:56 PM5/4/11
to H2 Database
Same problem with SQLState 42001, 42101, 42102, 42111, 42112, 42121,
42122. It's also not clear how 42001 differs from 42000, or 90028
differs from 90031 (the explanations are virtually the same).

I believe the description of 90012 contains a typo. "statement with an
parameter" should be "statement without a parameter".

Gili

On May 4, 6:16 pm, cowwoc <cow...@bbs.darktech.org> wrote:
> Hi Thomas,
>
> I noticed that H2 definesSQLState21002 but this is not listed byhttp://kb.askmonty.org/v/no-data-sqlstates(which leads me to believe
> it is non-standard) yet the number being used is supposed to be
> standard.
>
> Eitherhttp://kb.askmonty.org/v/no-data-sqlstatesis not a reliable
> source for standard SQLStates, or H2 is hijacking reserved numbers.
> What do you think?
>
> Gili
>
> On May 4, 3:36 pm, Thomas Mueller <thomas.tom.muel...@gmail.com>
> wrote:
>
>
>
>
>
>
>
> > Hi,
>
> > Sure, there are examples at:http://h2database.com/javadoc/org/h2/constant/ErrorCode.html#c23503ht...
>
> > Regards,
> > Thomas

Thomas Mueller

unread,
May 9, 2011, 1:06:33 PM5/9/11
to h2-database
Hi,

What is your use case exactly? Do you have an application that needs
to parse the SQL state?

Well, SQL states are not well defined unfortunately. The following statements:

drop table test;
create table test(id int, name varchar(255));
insert into test(id, name) values(1);

will result in different SQL states:

42564 (HSQLDB: row column count mismatch)
42601 (PostgreSQL: INSERT has more target columns than expressions)
42802 (Derby: The number of values assigned is not the same ...)
21S01 (MySQL: Column count doesn't match value count at row 1)
21S02 (H2: Column count does not match)

Regards,
Thomas

cowwoc

unread,
May 9, 2011, 3:38:11 PM5/9/11
to h2-da...@googlegroups.com

Hi Thomas,

My use-case is as follows: Client issues an HTTP request that leads
to a database transaction involving an insert. The insert could fail for
two reasons:

1. General database error (unrecoverable). Perhaps "retry later" when
service is back up.
2. Client violated integrity constraints (attempted to insert an
Employee with an invalid Company id)

In the case of #2, I want to inform the user that the referenced
Company no longer exists. I do this by parsing SQLState and if it
indicates an integrity violation I return one error message or another.
It is important to note that I am returning different HTTP return codes
for each case so it is important to be able to differentiate between the
two cases. A web client will handle HTTP 500 (INTERNAL SERVER ERROR)
different from HTTP 400 (BAD REQUEST).

Is there a better way for me to do this? I would love to avoid all
this parsing and portability problems.

Thanks,
Gili

Thomas Mueller

unread,
May 12, 2011, 3:34:33 PM5/12/11
to h2-database
Hi,

1. General database error (unrecoverable). Perhaps "retry later" when service is back up.
2. Client violated integrity constraints (attempted to insert an Employee with an invalid Company id)

The first two characters of the SQL state should work in this case. Recoverable are:

- Class Code 23 Constraint Violation
- Class Code 22: Data Exception

Other exceptions are usually not recoverable. See also:

http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/core/r0sttmsg.htm

Regards,
Thomas

cowwoc

unread,
May 12, 2011, 10:04:23 PM5/12/11
to H2 Database
Hi Thomas,

On Apr 28, 4:44 pm, Thomas Mueller <thomas.tom.muel...@gmail.com>
wrote:
> Are SQL states really standardized to the last digit? When searching
> for "sqlstate23503" in Google, I find IBM DB2 documentation, but no
> link to any standard.

I managed to get my hands on the SQL:2008 draft. I finally have a
conclusive answer to your question:

------quote-------
The character string value returned in an SQLSTATE parameter comprises
a 2-character class value followed
by a 3-character subclass value, each with an implementation-defined
character set that has a one-octet character
encoding form and is restricted to <digit>s and <simple Latin upper
case letter>s. Table 33, “SQLSTATE class
and subclass values”, specifies the class value for each condition and
the subclass value or values for each class
value.
Class values that begin with one of the <digit>s '0', '1', '2', '3',
or '4' or one of the <simple Latin upper case letter>s
'A', 'B', 'C', 'D', 'E', 'F', 'G', or 'H' are returned only for
conditions defined in ISO/IEC 9075 or in any other
International Standard. The range of such class values are called
standard-defined classes. Some such class
codes are reserved for use by specific International Standards, as
specified elsewhere in this Clause. Subclass
values associated with such classes that also begin with one of those
13 characters are returned only for conditions
defined in ISO/IEC 9075 or some other International Standard. The
range of such class values are called standard-
defined classes. Subclass values associated with such classes that
begin with one of the <digit>s '5', '6', '7', '8',
or '9' or one of the <simple Latin upper case letter>s 'I', 'J', 'K',
'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
'X', 'Y', or 'Z' are reserved for implementation-specified conditions
and are called implementation-defined
subclasses.
Class values that begin with one of the <digit>s '5', '6', '7', '8',
or '9' or one of the <simple Latin upper case letter>s
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
'W', 'X', 'Y', or 'Z' are reserved for implementation-specified
exception conditions and are called implementation-defined classes.
All subclass values except '000', which
means no subclass, associated with such classes are reserved for
implementation-specified conditions and are
called implementation-defined subclasses. An implementation-defined
completion condition shall be indicated
by returning an implementation-defined subclass in conjunction with
one of the classes successful completion,
warning, or no data.
If a subclass value is not specified for a condition, then either
subclass '000' or an implementation-defined
subclass is returned.
------quote-------

So if I understand correctly, you are allowed to define implementation-
specific SQLStates for standard categories (such as 23xxx) so long as
the sub-class begins with the implementation-specific characters. In
other words, it should be legal to use define a implementation-
specific code 23053.

The standard goes on to define specific SQLStates (down to the last 5
characters). I can point you to the full document if you wish to read
further.

Gili

cowwoc

unread,
May 14, 2011, 10:58:07 AM5/14/11
to H2 Database
I went through the SQL:2008 draft standard and created an enum for all
SQLStates. The only SQLStates without full Javadoc are HZxxx for
remote database access (patches welcome!). This was *a lot* of work :)
I hope you find this useful.

Gili

-------------------------------
import com.google.common.collect.Maps;
import java.util.Map;

/**
* Standard SQLState codes.
*
* Codes are listed in the same order as the SQL:2008 standard.
*
* @author Gili Tzabari
* @see http://en.wikipedia.org/wiki/SQL#cite_note-27
* @see http://kb.askmonty.org/v/sqlstate-codes
*/
public enum SQLState
{
/**
* Returned if the statement contains a preparable dynamic cursor
name that is ambiguous.
*/
AMBIGUOUS_CURSOR_NAME("3C000"),
/**
* Attempted to assign a value to a non-updatable column.
*/
CANNOT_ASSIGN_TO_NON_UPDATABLE_COLUMN("0U000"),
/**
* Returned if any object column is directly or indirectly referenced
in the <code>order by</code> clause
* of a dynamic cursor definition.
*/
CANNOT_ASSIGN_TO_ORDERING_COLUMN("0V000"),
/**
* The result of a SELECT INTO, scalar fullselect, or subquery of a
basic predicate returned more
* than one value.
*/
CARDINALITY_VIOLATION("21000"),
/**
* Unable to establish a database connection.
*/
CONNECTION_EXCEPTION("08000"),
/**
* Attempted to disconnect a non-existent database connection.
*/
CONNECTION_DOES_NOT_EXIST("08003"),
/**
* The specified connection could not be selected.
*/
CONNECTION_FAILURE("08006"),
/**
* Returned if a connection with the specified name is already
established.
*/
CONNECTION_NAME_IN_USE("08002"),
/**
* Returned if the client is unable to connect to the database.
*/
CANNOT_ESTABLISH_CONNECTION("08001"),
/**
* Returned if the server rejected the client's connection request.
*/
CONNECTION_REJECTED("08004"),
/**
* Connection lost while committing or rolling back a transaction.
The client cannot verify
* whether the transaction was committed successfully, rolled back or
left active.
*/
TRANSACTION_RESOLUTION_UNKNOWN("08007"),
/**
* The "cursor sensitivity exception" class identifies exception
conditions that relate to Cursors
* and their sensitivity attribute.
*
* If a holdable cursor is open during an SQL-transaction <code>T</
code> and it is held open for
* a subsequent SQL-transaction, then whether any significant changes
made to SQL-data (by
* <code>T</code> or any subsequent SQL-transaction in which the
cursor is held open) are visible
* through that cursor in the subsequent SQL-transaction before that
cursor is closed is
* determined as follows:
*
* - If the cursor is insensitive, then significant changes are not
visible.
* - If the cursor is sensitive, then the visibility of significant
changes is implementation-defined.
* - If the cursor is asensitive, then the visibility of significant
changes.
*/
CURSOR_SENSITIVITY_EXCEPTION("36000"),
/**
* Returned if a sensitive cursor has not been held into a subsequent
SQL-transaction, and the
* change resulting from the successful execution of this statement
could not be made visible to
* the cursor.
*
* For example, an attempt was made to execute a positioned DELETE
statement, but there is a
* sensitive Cursor open, and (for some implementation-dependent
reason) the effects of the
* DELETE cannot be made visible via that Cursor.
*/
CURSOR_SENSITIVITY_REQUEST_FAILED("36002"),
/**
* A cursor is insensitive, and the SQL-implementation is unable to
guarantee that significant
* changes will be invisible through the cursor during the SQL-
transaction in which it is opened
* and every subsequent SQL-transaction during which it may be held
open.
*/
CURSOR_SENSITIVITY_REQUEST_REJECTED("36001"),
/**
* The specified data was inappropriate for the column type.
*/
DATA_EXCEPTION("22000"),
/**
* The maximum number of elements in the target array is less than
the number of elements in
* the source array and the extra source elements are not all NULL.
*/
ARRAY_DATA_RIGHT_TRUNCATION_EXCEPTION("2202F"),
/**
* Attempted to reference an array index which is out of range.
*/
ARRAY_ELEMENT_ERROR("2202E"),
/**
* Attempted to replace a substring that matches an XQuery regular
expression with a replacement
* character string, but the matching substring is a zero-length
string.
*/
ZERO_LENGTH_STRING("2201U"),
/**
* A character is not in the coded character set or the conversion is
not supported.
*/
CHARACTER_NOT_IN_REPERTOIRE("22021"),
/**
* Datetime field overflow occurred; for example, an arithmetic
operation on a date or timestamp
* has a result that is not within the valid range of dates. See also
SQLSTATE 22007.
*/
DATETIME_FIELD_OVERFLOW("22008"),
/**
* Attempted to divide a number by zero.
*/
DIVISION_BY_ZERO("22012"),
/**
* An error occurred on assignment.
*/
ERROR_IN_ASSIGNMENT("22005"),
/**
* Attempted to use an invalid escape character.
*/
ESCAPE_CHARACTER_CONFLICT("2200B"),
/**
* Indicator is too small for size value.
*/
INDICATOR_OVERFLOW("22022"),
/**
* The value of an interval field exceeded its maximum value. See
also SQLSTATE 22006.
*/
INTERVAL_FIELD_OVERFLOW("22015"),
/**
The result of an aggregate function is out of the range of an
interval type.
*/
INTERVAL_VALUE_OUT_OF_RANGE("2200P"),
/**
* Passed an invalid argument into a LOG function.
*/
INVALID_ARGUMENT_FOR_LOGARITHM("2201E"),
/**
* Passed an invalid argument into a POWER function.
*/
INVALID_ARGUMENT_FOR_POWER_FUNCTION("2201F"),
/**
* Passed an invalid argument into a WIDTH_BUCKET function.
*/
INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION("2201G"),
/**
* Tried to convert a value to a data type where the conversion is
undefined, or when an error
* occurred trying to convert.
*/
INVALID_CHARACTER_VALUE_FOR_CAST("22018"),
/**
* An invalid datetime format was detected; that is, an invalid
string representation or value
* was specified. See also SQLSTATE 22008, 22018.
*/
INVALID_DATETIME_FORMAT("22007"),
/**
* The LIKE predicate has an invalid escape character.
*/
INVALID_ESCAPE_CHARACTER("22019"),
/**
* Returned if the length of the escape octet is not one.
*/
INVALID_ESCAPE_OCTET("2200D"),
/**
* The LIKE predicate string pattern contains an invalid occurrence
of an escape character.
*/
INVALID_ESCAPE_SEQUENCE("22025"),
/**
* The value of the indicator variable is less than zero but is not
equal to -1 (SQL_NULL_DATA).
*/
INVALID_INDICATOR_PARAMETER_VALUE("22010"),
/**
* Specified an interval with an invalid format. For example, a year-
month interval should
* contain only a year integer, a '-' separator, and a month integer.
See also SQLSTATE 22015.
*/
INVALID_INTERVAL_FORMAT("22006"),
/**
* A parameter or host variable value is invalid.
*/
INVALID_PARAMETER_VALUE("22023"),
/**
* Returned if the window frame bound preceding or following a WINDOW
function is negative or null.
*
* @see http://en.wikipedia.org/wiki/Select_%28SQL%29#Window_function
*/
INVALID_SIZE_IN_WINDOW_FUNCTION("22013"),
/**
* Returned if the specified regular expression does not have a valid
format.
*/
INVALID_REGULAR_EXPRESSION("2201B"),
/**
* Invalid repeat argument in SAMPLE clause.
*/
INVALID_REPEAT_ARGUMENT_IN_SAMPLE_CLAUSE("2202G"),
/**
* The sample size was less than 0 or more than 100.
*/
INVALID_SAMPLE_SIZE("2202H"),
/**
* The time zone displacement value is outside the range -12:59 to
14:00.
*
* This could happen for "SET LOCAL TIME ZONE INTERVAL '22:00' HOUR
TO MINUTE;", or for
* "TIMESTAMP '1994-01-01 02:00:00+10:00'". (In the latter case, it
is the result of the
* calculation that is a problem.)
*/
INVALID_TIME_ZONE_DISPLACEMENT_VALUE("22009"),
/**
* A required escape character was missing or in the wrong location.
*/
INVALID_USE_OF_ESCAPE_CHARACTER("2200C"),
/**
* The specified xquery option flag is invalid.
*/
INVALID_XQUERY_OPTION_FLAG("2201T"),
/**
* The regular expression specified in the xquery expression is
invalid.
*/
INVALID_XQUERY_REGULAR_EXPRESSION("2201S"),
/**
* The replacement string specified in the xquery expression is
invalid.
*/
INVALID_XQUERY_REPLACEMENT_STRING("2201V"),
/**
* Returned if the return value of a type-preserving function is not
compatible with most specific
* return type of the function.
*/
MOST_SPECIFIC_TYPE_MISMATCH("2200G"),
/**
* The result of an aggregate function is out of the range of a
multiset type.
*/
MULTISET_VALUE_OVERFLOW("2200Q"),
/**
* Returned when an operation inserts a non-character code point into
a unicode string.
*/
NONCHARACTER_IN_UCS_STRING("22029"),
/**
* Attempted to invoke a mutator function on NULL.
*/
NULL_INSTANCE_USED_IN_MUTATOR_FUNCTION("2202D"),
/**
* Attempted to insert a null row into a table that disallows them.
*/
NULL_ROW_NOT_PERMITTED_IN_TABLE("2201C"),
/**
* Attempted to assign a value to an array index whose value was
null.
*/
NULL_VALUE_IN_ARRAY_TARGET("2200E"),
/**
* A null value, or the absence of an indicator parameter was
detected; for example, the null
* value cannot be assigned to a host variable, because no indicator
variable is specified.
*/
NULL_VALUE_NO_INDICATOR_PARAMETER("22002"),
/**
* A null value is not allowed.
*/
NULL_VALUE_NOT_ALLOWED_BY_FUNCTION("22004"),
/**
* A numeric value is out of range. Often this is the result of an
arithmetic overflow.
* For example, "UPDATE ... SET SMALLINT_COLUMN = 9999999999".
*/
NUMERIC_VALUE_OUT_OF_RANGE("22003"),
/**
* Returned if a sequence generator cannot generate any more numbers
because it has already
* generated its maximum value and it is configured with NO CYCLE.
*/
SEQUENCE_GENERATOR_LIMIT_EXCEEDED("2200H"),
/**
* Attempted to update a bit string but the specified value does not
match the length of the bit
* string.
*/
STRING_DATA_LENGTH_MISMATCH("22026"),
/**
* Character data, right truncation occurred; for example, an update
or insert value is a string
* that is too long for the column, or a datetime value cannot be
assigned to a host variable,
* because it is too small. No truncation actually occurs since the
SQL statement fails. See
* SQLSTATE 01004.
*/
STRING_DATA_RIGHT_TRUNCATION("22001"),
/**
* A substring error occurred; for example, an argument of SUBSTR is
out of range.
*/
SUBSTRING_ERROR("22011"),
/**
* Attempted to invoke the TRIM function with a first argument whose
length was greater than
* one character.
*/
TRIM_ERROR("22027"),
/**
* A NULL-terminated input host variable or parameter did not contain
a NULL.
*/
UNTERMINATED_C_STRING("22024"),
/**
* Character strings must have a length of one.
*/
ZERO_LENGTH_CHARACTER_STRING("2200F"),
/**
* Attempted to "REVOKE GRANT OPTION FOR" with dependent privileges
and without a "CASCADE".
*/
DEPENDENT_PRIVILEGE_DESCRIPTORS_STILL_EXIST("2B000"),
/**
* An error occurred while invoking a diagnostics function.
*/
DIAGNOSTICS_EXCEPTION("0Z000"),
/**
* Attempted to PUSH an operation onto the diagnostics stack but the
number of operations in
* the stack exceed the implementation-dependent maximum.
*/
MAXIMUM_NUMBER_OF_STACKED_DIAGNOSTICS_AREAS_EXCEEDED("0Z001"),
/**
* An error occurred while executing dynamic SQL.
*/
DYNAMIC_SQL_ERROR("07000"),
/**
* Returned if prepared statement does not conform to the Format and
Syntax Rules of a dynamic
* single row select statement.
*/
CURSOR_SPECIFICATION_CANNOT_BE_EXECUTED("07003"),
/**
* The supplied input or output arguments could not be transformed to
the types expected by the
* dynamic SQL script.
*/
DATA_TYPE_TRANSFORM_FUNCTION_VIOLATION("0700B"),
/**
* Specified a descriptor item name DATA on a descriptor area whose
type is ARRAY, ARRAY LOCATOR,
* MULTISET, or MULTISET LOCATOR.
*/
INVALID_DATA_TARGET("0700D"),
/**
* Specified an invalid datetime interval.
*/
INVALID_DATETIME_INTERVAL_CODE("0700F"),
/**
* Using the embedded SQL ALLOCATE DESCRIPTOR statement, you
allocated a 5-item descriptor.
* Now you are trying to use the sixth item in that descriptor. See
also SQLSTATE 07009.
*/
INVALID_DESCRIPTOR_COUNT("07008"),
/**
* you are using a CLI descriptor function (such as SQLBindCol or
SQLBindParameter) and the
* Column number is less than 1 or greater than the maximum number of
Columns. Or, you are using
* the embedded SQL ALLOCATE DESCRIPTOR statement with a size which
is less than 1 or greater
* than an implementation-defined maximum. See also SQLSTATE 07008.
*/
INVALID_DESCRIPTOR_INDEX("07009"),
/**
* Invalid LEVEL specified in SET DESCRIPTOR statement.
*/
INVALID_LEVEL_VALUE("0700E"),
/**
* The statement name of the cursor identifies a prepared statement
that cannot be associated
* with a cursor.
*/
PREPARED_STATEMENT_NOT_A_CURSOR_SPECIFICATION("07005"),
/**
* An input variable, transition variable, or parameter marker cannot
be used, because of its
* data type.
*/
RESTRICTED_DATA_TYPE_ATTRIBUTE_VIOLATION("07006"),
/**
* Attempted to GET DESCRIPTOR DATA on a descriptor area whose type
is ARRAY, ARRAY LOCATOR,
* MULTISET, or MULTISET LOCATOR.
*/
UNDEFINED_DATA_VALUE("0700C"),
/**
* You might encounter this error if you set the length of a
descriptor, then
* <code>EXECUTE ... USING descriptor</code>. Often this exception
results from consistency-check
* failure during SQLExecute.
*/
USING_CLAUSE_DOES_NOT_MATCH_DYNAMIC_PARAMETERS("07001"),
/**
* Often this exception results from consistency-check failure during
SQLExecute.
*
* Sometimes this exception results from an incorrect number of
parameters. See also
* SQLSTATE 07008.
*/
USING_CLAUSE_DOES_NOT_MATCH_TARGET_SPECIFICATIONS("07002"),
/**
* You cannot simply EXECUTE an SQL statement which has dynamic
parameters — you also need to
* use a USING clause. See also SQLSTATE 07007.
*/
USING_CLAUSE_REQUIRED_FOR_DYNAMIC_PARAMETERS("07004"),
/**
* You cannot simply EXECUTE an SQL statement which has result fields
— you also need to use a
* USING clause. See also SQLSTATE 07004.
*/
USING_CLAUSE_REQUIRED_FOR_RESULT_FIELDS("07007"),
/**
* An error occurred executing an external routine.
*
* External routines are stored procedures implemented by non-SQL
languages (i.e. Java).
*/
EXTERNAL_ROUTINE_EXCEPTION("38000"),
/**
* The external routine is not allowed to execute SQL statements.
*/
CONTAINING_SQL_NOT_PERMITTED("38001"),
/**
* The routine attempted to modify data, but the routine was not
defined as MODIFIES SQL DATA.
*/
MODIFYING_SQL_DATA_NOT_PERMITTED("38002"),
/**
* The statement is not allowed in a routine.
*/
PROHIBITED_SQL_STATEMENT_ATTEMPTED_BY_ROUTINE("38003"),
/**
* The external routine attempted to read data, but the routine was
not defined as READS SQL DATA.
*/
READING_SQL_DATA_NOT_PERMITTED_BY_ROUTINE("38004"),
/**
* An error occurred before or after invoking an external routine.
*
* External routines are stored procedures implemented by non-SQL
languages (i.e. Java).
*/
EXTERNAL_ROUTINE_INVOCATION_EXCEPTION("39000"),
/**
* A null value is not allowed for an IN or INOUT argument when using
PARAMETER STYLE GENERAL or
* an argument that is a Java™ primitive type.
*/
NULL_VALUE_NOT_ALLOWED_BY_EXTERNAL_ROUTINE("39004"),
/**
* The "feature not supported" class identifies exception conditions
that relate to features
* you're trying to use, but that your DBMS hasn't implemented. The
Standard does not specify
* what will cause this SQLSTATE, possibly because the expectation is
that all features will
* be supported.
*/
FEATURE_NOT_SUPPORTED("0A000"),
/**
* A single transaction cannot be performed on multiple servers. Such
a feature is sophisticated
* and rare.
*/
MULTIPLE_SERVER_TRANSACTIONS("0A001"),
/**
* The operation violated a table constraint.
*/
INTEGRITY_CONSTRAINT_VIOLATION("23000"),
/**
* The update or delete of a parent key is prevented by a RESTRICT
update or delete rule.
* See also SQLSTATE 40002.
*/
RESTRICT_VIOLATION("23001"),
/**
* Authorization name is invalid.
*/
INVALID_AUTHORIZATION_SPECIFICATION("28000"),
/**
* A <code>Catalog name</code> could be invalid if it is used as a
qualifier or as the
* argument of SET CATALOG, and does not refer to an existing Catalog
or is not a valid
* <code>identifier</code>.
*/
INVALID_CATALOG_NAME("3D000"),
/**
* Presumably an invalid Character set name would be one that begins
with a digit, contains a
* non-Latin letter, etc.
*/
INVALID_CHARACTER_SET_NAME("2C000"),
/**
* With embedded SQL, you get this by saying "GET DIAGNOSTICS
EXCEPTION 0". With the CLI, you get
* this by calling SQLGetDiagRec or SQLGetDiagField with a
RecordNumber parameter less than 1.
* If RecordNumber is greater than the number of status records, you
don't get this error.
* Instead, you get an NO_DATA return code.
*/
INVALID_CONDITION_NUMBER("35000"),
/**
* For a CONNECT statement, the argument must be a valid
<code>identifier</code>.
*/
INVALID_CONNECTION_NAME("2E000"),
/**
* Cursor name is invalid.
*/
INVALID_CURSOR_NAME("34000"),
/**
* The cursor is closed or has no current row.
*/
INVALID_CURSOR_STATE("24000"),
/**
* The specified grantor may not GRANT access.
*/
INVALID_GRANTOR("0L000"),
/**
* Invalid role specification. The specified role does not exist or
is not granted to the
* specified user.
*/
INVALID_ROLE_SPECIFICATION("0P000"),
/**
* The schema (collection) name is invalid.
*/
INVALID_SCHEMA_NAME("3F000"),
/**
* An error occurred while specifying Schema paths.
*/
INVALID_SCHEMA_NAME_LIST_SPECIFICATION("0E000"),
/**
* A <code>Collation name</code> could be invalid if it is used as a
qualifier or as the
* argument of SET COLLATION, and does not refer to an existing
Collation or is not a valid
* <code>identifier</code>.
*/
INVALID_COLLATION_NAME("2H000"),
/**
* Returned if, in embedded SQL, you use "EXECUTE ... USING
DESCRIPTOR 'X';", a descriptor named
* X must exist.
*/
INVALID_SQL_DESCRIPTOR_NAME("33000"),
/**
* Returned if the SQL-session context of the current SQL-session
does not include a result set
* sequence brought into existence by an invocation of SQL-invoked
procedure by the active
* SQL-invoked routine.
*/
INVALID_SQL_INVOKED_PROCEDURE_REFERENCE("0M000"),
/**
* Probable cause: you failed to PREPARE an SQL statement and now you
are trying to EXECUTE it.
*/
INVALID_SQL_STATEMENT_NAME("26000"),
/**
* Attempted to refer to a statement that should have been prepared,
but was not.
*/
INVALID_SQL_STATEMENT_IDENTIFIER("30000"),
/**
* An error occurred specifying a target for data.
*/
INVALID_TARGET_TYPE_SPECIFICATION("0D000"),
/**
* The operation violated the transaction constraints.
*/
INVALID_TRANSACTION_STATE("25000"),
/**
* START TRANSACTION or DISCONNECT or SET SESSION AUTHORIZATION or
SET ROLE statements cannot be
* issued if a transaction has already been started.
*/
ACTIVE_SQL_TRANSACTION("25001"),
/**
* SET TRANSACTION LOCAL ..., which applies only in multiple-server
contexts, is illegal if a
* local transaction is already happening.
*/
BRANCH_TRANSACTION_ALREADY_ACTIVE("25002"),
/**
* The SET TRANSACTION statement cannot be used to change isolation
level if there is a held
* Cursor made with a different isolation level left over from the
last transaction.
*/
HELD_CURSOR_REQUIRES_SAME_ISOLATION_LEVEL("25008"),
/**
* Returned if the transaction access mode of the SQL-transaction is
read-only and transaction
* access mode specifies READWRITE.
*/
INAPPROPRIATE_ACCESS_MODE_FOR_BRANCH_TRANSACTION("25003"),
/**
* Returned if the isolation level of the SQL-transaction is
SERIALIZABLE and level of isolation
* specifies anything except SERIALIZABLE, or if the isolation level
of the SQL-transaction is
* REPEATABLE READ and level of isolation specifies anything except
REPEATABLE READ or
* SERIALIZABLE, or if the isolation level of the SQL-transaction is
READ COMMITTED and level of
* isolation specifies READ UNCOMMITTED.
*/
INAPPROPRIATE_ISOLATION_LEVEL_FOR_BRANCH_TRANSACTION("25004"),
/**
* Returned if SET LOCAL TRANSACTION is executed and there is no
active transaction.
*/
NO_ACTIVE_SQL_TRANSACTION_FOR_BRANCH_TRANSACTION("25005"),
/**
* An update operation is not valid because the transaction is read-
only.
*/
READ_ONLY_SQL_TRANSACTION("25006"),
/**
* Some DBMSs do not allow SQL-Schema statements (such as CREATE) to
be mixed with SQL-data
* statements (such as INSERT) in the same transaction.
*/
SCHEMA_AND_DATA_STATEMENT_MIXING_NOT_SUPPORTED("25007"),
/**
* An error occurred trying to commit or rollback a transaction.
*/
INVALID_TRANSACTION_TERMINATION("2D000"),
/**
* A <code>Transform Group name</code> could be invalid if it is used
as a qualifier or as the
* argument of SET TRANSFORM GROUP, and does not refer to an existing
Transform Group or is not
* a valid <code>identifier</code>.
*/
INVALID_TRANSFORM_GROUP_NAME_SPECIFICATION("0S000"),
/**
* The "locator exception" class identifies exception conditions that
relate to locators: BLOB
* and CLOB data types, and their values.
*/
LOCATOR_EXCEPTION("0F000"),
/**
* The locator value does not currently represent any value.
*/
INVALID_LOCATOR_SPECIFICATION("0F001"),
/**
* One of the following exceptions occurred:
*
* <ol>
* <li>The result of the SELECT INTO statement or the subselect of
the INSERT statement was an
* empty table.</li>
* <li>The number of rows identified in the searched UPDATE or DELETE
statement was zero./<li>
* <li>The position of the cursor referenced in the FETCH statement
was before the first row or
* after the last row of the result table.</li>
* <li>The fetch orientation is invalid.</li>
* </ol>
*/
NO_DATA("02000"),
/**
* No additional result sets returned.
*/
NO_ADDITIONAL_DYNAMIC_RESULT_SETS_RETURNED("02001"),
/**
* The statement is not allowed in a trigger.
*/
PROHIBITED_STATEMENT_ENCOUNTERED_DURING_TRIGGER("0W000"),
/**
* An error occurred while an SQL-client interacted with an SQL-
server across a communications
* network using an RDA Application Context.
*/
REMOTE_DATABASE_ACCESS("HZ000"),
ATTRIBUTE_NOT_PERMITTED("HZ301"),
AUTHENTICATION_FAILURE("HZ302"),
DUPLICATE_REQUEST_IDENT("HZ303"),
ENCODING_NOT_SUPPORTED("HZ304"),
FEATURE_NOT_SUPPORTED_MULTIPLE_SERVER_TRANSACTIONS("HZ305"),
INVALID_ATTRIBUTE_TYPE("HZ306"),
INVALID_FETCH_COUNT("HZ307"),
INVALID_MESSAGE_TYPE("HZ308"),
INVALID_OPERATION_SEQUENCE("HZ309"),
INVALID_TRANSACTION_OPERATION_CODE("HZ310"),
MISMATCH_BETWEEN_DESCRIPTOR_AND_ROW("HZ311"),
NO_CONNECTION_HANDLE_AVAILABLE("HZ312"),
NUMBER_OF_VALUES_DOES_NOT_MATCH_NUMBER_OF_ITEM_DESCRIPTORS("HZ313"),
TRANSACTION_CANNOT_COMMIT("HZ314"),
TRANSACTION_STATE_UNKNOWN("HZ315"),
TRANSPORT_FAILURE("HZ316"),
UNEXPECTED_PARAMETER_DESCRIPTOR("HZ317"),
UNEXPECTED_ROW_DESCRIPTOR("HZ318"),
UNEXPECTED_ROWS("HZ319"),
VERSION_NOT_SUPPORTED("HZ320"),
TCPIP_ERROR("HZ321"),
TLS_ALERT("HZ322"),
/**
* An error occurred using a savepoint.
*/
SAVEPOINT_EXCEPTION("3B000"),
/**
* The savepoint is not valid.
*/
INVALID_SAVEPOINT_SPECIFICATION("3B001"),
/**
* The maximum number of savepoints has been reached.
*/
TOO_MANY_SAVEPOINTS("3B002"),
/**
* SQL routine is a procedure or function which is written in SQL.
SQLSTATE class 2F identifies
* exception conditions that relate to SQL routines. (Exceptions for
non-SQL routines are class
* 38.)
*/
SQL_ROUTINE_EXCEPTION("2F000"),
/**
* The function did not execute a RETURN statement.
*/
FUNCTION_EXECUTED_NO_RETURN_STATEMENT("2F005"),
/**
* The SQL function attempted to modify data, but the function was
not defined as
* MODIFIES SQL DATA.
*/
MODIFYING_SQL_DATA_NOT_PERMITTED_BY_FUNCTION("2F002"),
/**
* The statement is not allowed in a function or procedure.
*/
PROHIBITED_SQL_STATEMENT_ATTEMPTED_BY_FUNCTION("2F003"),
/**
* The SQL function attempted to read data, but the function was not
defined as READS SQL DATA.
*/
READING_SQL_DATA_NOT_PERMITTED("2F004"),
/**
* Completion of the operation was successful and did not result in
any type of warning or
* exception condition.
*/
SUCCESSFUL_COMPLETION("00000"),
/**
* Syntax errors include not just grammar or spelling errors, but
"bind problems" such as
* failure to find an Object. Access violations are due to lack of
Privileges. A high security
* DBMS will try to hide from the user whether the problem is "you
don't have access to X" as
* opposed to "X isn't there"; that's why these two different
categories are lumped together in
* one SQLSTATE (thus users can't discover what the Table names are
by trying out all the
* possibilities).
*/
SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION("42000"),
/**
* Invoked a dynamic update or delete statement but the cursor
specification conflicts with the
* specification of the table it is operating over.
*/
TARGET_TABLE_DISAGREES_WITH_CURSOR_SPECIFICATION("0T000"),
/**
* An error has triggered a rollback the transaction.
*/
TRANSACTION_ROLLBACK("40000"),
/**
* This occurs for COMMIT, if there were deferred Constraints
(deferred Constraints aren't
* checked until COMMIT time unless SET CONSTRAINTS IMMEDIATE is
executed). So: you asked for
* COMMIT, and what you got was ROLLBACK. See also SQLSTATE 23000.
*/
TRANSACTION_INTEGRITY_CONSTRAINT_VIOLATION("40002"),
/**
* The database engine has detected a deadlock. The transaction of
this session has been rolled
* back to solve the problem. A deadlock occurs when a session tries
to lock a table another
* session has locked, while the other session wants to lock a table
the first session has
* locked. As an example, session 1 has locked table A, while session
2 has locked table B.
* If session 1 now tries to lock table B and session 2 tries to lock
table A, a deadlock has
* occurred. Deadlocks that involve more than two sessions are also
possible. To solve deadlock
* problems, an application should lock tables always in the same
order, such as always lock
* table A before locking table B. For details, see
* <a href="http://en.wikipedia.org/wiki/Deadlock">Wikipedia
Deadlock</a>.
*/
SERIALIZATION_FAILURE("40001"),
/**
* The SQL-Connection was lost during execution of an SQL statement.
*/
STATEMENT_COMPLETION_UNKNOWN("40003"),
/**
* This occurs for COMMIT, if there was a deferred Constraint —
presumably a FOREIGN KEY
* Constraint unless Triggers are supported by the DBMS — and there
was an attempt to violate the
* Constraint. See also SQLSTATE 09000, 27000.
*/
TRIGGERED_ACTION_EXCEPTION_AT_COMMIT("40004"),
/**
* A triggered SQL statement failed.
*/
TRIGGERED_ACTION_EXCEPTION("09000"),
/**
* An attempt was made to modify the target table of the MERGE
statement by a constraint or
* trigger. See also SQLSTATE 09000, 40004.
*/
TRIGGERED_DATA_CHANGE_VIOLATION("27000"),
/**
* The operation completed with a warning.
*/
WARNING("01000"),
/**
* The cursor that was closed has been reopened on the next result
set within the chain.
*/
ADDITIONAL_RESULT_SETS_RETURNED("0100D"),
/**
* The maximum number of elements in the target array is less than
the number of elements in
* the source array and the extra source elements are all NULL. The
database will assign as many
* of the source element values to the target elements as is
possible.
*/
ARRAY_DATA_RIGHT_TRUNCATION_WARNING("0102F"),
/**
* The procedure returned too many result sets.
*/
TOO_MANY_RESULT_SETS("0100E"),
/**
* Returned if you DELETE with and without a Cursor in the same
transaction.
*/
CURSOR_OPERATION_CONFLICT("01001"),
/**
* This is the same as warning 01009 except that instead of a search
condition (as in a CHECK
* clause), you're using a default value.
*/
DEFAULT_VALUE_TOO_LONG_FOR_INFORMATION_SCHEMA("0100B"),
/**
* There was an error during execution of the CLI function
SQLDisconnect, but you won't be able
* to see the details because the SQLDisconnect succeeded.
*/
DISCONNECT_ERROR("01002"),
/**
* One or more ad hoc result sets were returned from the procedure.
*/
DYNAMIC_RESULT_SETS_RETURNED("0100C"),
/**
* Every descriptor area has multiple IDAs. You need one IDA per
Column of a result set, or one
* per parameter. Either reduce the number of Columns in the select
list or reduce the number of
* ?s in the SQL statement as a whole.
*/
INSUFFICIENT_ITEM_DESCRIPTOR_AREAS("01005"),
/**
* Null values were eliminated from the argument of a column
function.
*/
NULL_VALUE_ELIMINATED_IN_SET_FUNCTION("01003"),
/**
* A privilege was not granted.
*/
PRIVILEGE_NOT_GRANTED("01007"),
/**
* A privilege was not revoked.
*/
PRIVILEGE_NOT_REVOKED("01006"),
/**
* This is the same as warning 01009 except that instead of a search
condition (as in a CHECK
* clause), you're using a query condition (usually SELECT). Thus, if
you say "CREATE VIEW ..."
* with a very long query, the size of Column VIEW_DEFINITION in View
VIEWS in INFORMATION_SCHEMA
* is a limiting factor.
*/
QUERY_EXPRESSION_TOO_LONG_FOR_INFORMATION_SCHEMA("0100A"),
/**
* Suppose you say "CREATE TABLE ... CHECK (<condition>)", and the
length of <condition> is
* larger than what can be stored in the INFORMATION_SCHEMA View,
CHECK_CONSTRAINTS, in its
* CHECK_CLAUSE Column. The Table will still be created — this
warning only means you won't be
* able to see the entire information about the Table when you look
at INFORMATION_SCHEMA. See
* also SQLState 0100A and 0100B.
*/
SEARCH_CONDITION_TOO_LONG_FOR_INFORMATION_SCHEMA("01009"),
/**
* Returned if the character representation of the triggered SQL
statement cannot be represented
* in the Information Schema without truncation.
*/
STATEMENT_TOO_LONG_FOR_INFORMATION_SCHEMA("0100F"),
/**
* The value of a string was truncated when assigned to another
string data type with a shorter
* length.
*/
STRING_DATA_RIGHT_TRUNCATION_ON_READ("01004"),
/**
* The INSERT or UPDATE is not allowed, because a resulting row does
not satisfy the view
* definition.
*/
WITH_CHECK_OPTION_VIOLATION("44000");
private static final Map<String, SQLState> codeToEnum =
Maps.newHashMap();
private final String code;

/**
* Creates a new SQLState.
*
* @param code the 5-character SQLState code
*/
SQLState(String code)
{
this.code = code;
assert (code.length() == 5): code;
}

static
{
for (SQLState value: values())
codeToEnum.put(value.getCode(), value);
}

/**
* Returns the code associated with the enum.
*
* @return the code
*/
public String getCode()
{
return code;
}

/**
* Returns the SQLState associated with the specified code.
*
* @param code the code (5 characters)
* @return the SQLState
* @throws IllegalArgumentException if no enum value is associated
with the specified code
*/
public static SQLState fromCode(String code)
{
SQLState result = codeToEnum.get(code);
if (result == null)
throw new IllegalArgumentException(code);
return result;
}

/**
* Returns the SQLState category.
*
* @return the SQLState category
*/
public Category getCategory()
{
try
{
return Category.fromCode(code.substring(0, 2));
}
catch (IllegalArgumentException e)
{
throw new AssertionError(e);
}
}

public enum Category
{
/**
* If the statement contains a preparable dynamic cursor name that
is ambiguous.
*/
AMBIGUOUS_CURSOR_NAME("3C"),
/**
* Attempted to assign a value to a non-updatable column.
*/
CANNOT_ASSIGN_TO_NON_UPDATABLE_COLUMN("0U"),
/**
* If any object column is directly or indirectly referenced in the
<code>order by</code> clause
* of a dynamic cursor definition.
*/
CANNOT_ASSIGN_TO_ORDERING_COLUMN("0V"),
/**
* The result of a SELECT INTO, scalar fullselect, or subquery of a
basic predicate returned more
* than one value.
*/
CARDINALITY_VIOLATION("21"),
/**
* Unable to establish a database connection.
*/
CONNECTION_EXCEPTION("08"),
/**
* The "cursor sensitivity exception" class identifies exception
conditions that relate to Cursors
* and their sensitivity attribute.
*/
CURSOR_SENSITIVITY_EXCEPTION("36"),
/**
* The specified data was inappropriate for the column type.
*/
DATA_EXCEPTION("22"),
/**
* Attempted to "REVOKE GRANT OPTION FOR" with dependent privileges
and without a "CASCADE".
*/
DEPENDENT_PRIVILEGE_DESCRIPTORS_STILL_EXIST("2B"),
/**
* An error occurred while invoking a diagnostics function.
*/
DIAGNOSTICS_EXCEPTION("0Z"),
/**
* An error occurred while executing dynamic SQL.
*/
DYNAMIC_SQL_ERROR("07"),
/**
* An error occurred executing an external routine.
*
* External routines are stored procedures implemented by non-SQL
languages (i.e. Java).
*/
EXTERNAL_ROUTINE_EXCEPTION("38"),
/**
* An error occurred before or after invoking an external routine.
*
* External routines are stored procedures implemented by non-SQL
languages (i.e. Java).
*/
EXTERNAL_ROUTINE_INVOCATION_EXCEPTION("39"),
/**
* The specified feature is not supported.
*/
FEATURE_NOT_SUPPORTED("0A"),
/**
* The operation violated a table constraint.
*/
INTEGRITY_CONSTRAINT_VIOLATION("23"),
/**
* Authorization name is invalid.
*/
INVALID_AUTHORIZATION_SPECIFICATION("28"),
/**
* A <code>Catalog name</code> could be invalid if it is used as a
qualifier or as the
* argument of SET CATALOG, and does not refer to an existing
Catalog or is not a valid
* <code>identifier</code>.
*/
INVALID_CATALOG_NAME("3D"),
/**
* Presumably an invalid Character set name would be one that begins
with a digit, contains a
* non-Latin letter, etc.
*/
INVALID_CHARACTER_SET_NAME("2C"),
/**
* With embedded SQL, you get this by saying "GET DIAGNOSTICS
EXCEPTION 0". With the CLI, you get
* this by calling SQLGetDiagRec or SQLGetDiagField with a
RecordNumber parameter less than 1.
* If RecordNumber is greater than the number of status records, you
don't get this error.
* Instead, you get an NO_DATA return code.
*/
INVALID_CONDITION_NUMBER("35"),
/**
* For a CONNECT statement, the argument must be a valid
<code>identifier</code>.
*/
INVALID_CONNECTION_NAME("2E"),
/**
* Cursor name is invalid.
*/
INVALID_CURSOR_NAME("34"),
/**
* The cursor is closed or has no current row.
*/
INVALID_CURSOR_STATE("24"),
/**
* The specified grantor may not GRANT access.
*/
INVALID_GRANTOR("0L"),
/**
* Invalid role specification. The specified role does not exist or
is not granted to the
* specified user.
*/
INVALID_ROLE_SPECIFICATION("0P"),
/**
* The schema (collection) name is invalid.
*/
INVALID_SCHEMA_NAME("3F"),
/**
* An error occurred while specifying Schema paths.
*/
INVALID_SCHEMA_NAME_LIST_SPECIFICATION("0E"),
/**
* A <code>Collation name</code> could be invalid if it is used as a
qualifier or as the
* argument of SET COLLATION, and does not refer to an existing
Collation or is not a valid
* <code>identifier</code>.
*/
INVALID_COLLATION_NAME("2H"),
/**
* Returned if, in embedded SQL, you use "EXECUTE ... USING
DESCRIPTOR 'X';", a descriptor named
* X must exist.
*/
INVALID_SQL_DESCRIPTOR_NAME("33"),
/**
* Returned if the SQL-session context of the current SQL-session
does not include a result set
* sequence brought into existence by an invocation of SQL-invoked
procedure by the active
* SQL-invoked routine.
*/
INVALID_SQL_INVOKED_PROCEDURE_REFERENCE("0M"),
/**
* Probable cause: you failed to PREPARE an SQL statement and now
you are trying to EXECUTE it.
*/
INVALID_SQL_STATEMENT_NAME("26"),
/**
* Attempted to refer to a statement that should have been prepared,
but was not.
*/
INVALID_SQL_STATEMENT_IDENTIFIER("30"),
/**
* An error occurred specifying a target for data.
*/
INVALID_TARGET_TYPE_SPECIFICATION("0D"),
/**
* The operation violated transaction constraints.
*/
INVALID_TRANSACTION_STATE("25"),
/**
* An error occurred trying to commit or rollback a transaction.
*/
INVALID_TRANSACTION_TERMINATION("2D"),
/**
* A <code>Transform Group name</code> could be invalid if it is
used as a qualifier or as the
* argument of SET TRANSFORM GROUP, and does not refer to an
existing Transform Group or is not
* a valid <code>identifier</code>.
*/
INVALID_TRANSFORM_GROUP_NAME_SPECIFICATION("0S"),
/**
* The "locator exception" class identifies exception conditions
that relate to locators: BLOB
* and CLOB data types, and their values.
*/
LOCATOR_EXCEPTION("0F"),
/**
* The operation did not return any data.
*/
NO_MORE_DATA("02"),
/**
* The statement is not allowed in a trigger.
*/
PROHIBITED_STATEMENT_ENCOUNTERED_DURING_TRIGGER("0W"),
/**
* An error occurred while an SQL-client interacted with an SQL-
server across a communications
* network using an RDA Application Context.
*/
REMOTE_DATABASE_ACCESS("HZ"),
/**
* An error occurred using a savepoint.
*/
SAVEPOINT_EXCEPTION("3B"),
/**
* SQL routine is a procedure or function which is written in SQL.
SQLSTATE class 2F identifies
* exception conditions that relate to SQL routines. (Exceptions for
non-SQL routines are class
* 38.)
*/
SQL_ROUTINE_EXCEPTION("2F"),
/**
* Completed successfully.
*/
SUCCESS("00"),
/**
* Syntax errors include not just grammar or spelling errors, but
"bind problems" such as
* failure to find an Object. Access violations are due to lack of
Privileges. A high security
* DBMS will try to hide from the user whether the problem is "you
don't have access to X" as
* opposed to "X isn't there"; that's why these two different
categories are lumped together in
* one SQLSTATE (thus users can't discover what the Table names are
by trying out all the
* possibilities).
*/
SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION("42"),
/**
* Invoked a dynamic update or delete statement but the cursor
specification conflicts with the
* specification of the table it is operating over.
*/
TARGET_TABLE_DISAGREES_WITH_CURSOR_SPECIFICATION("0T"),
/**
* An error has triggered a rollback the transaction.
*/
TRANSACTION_ROLLBACK("40"),
/**
* A triggered SQL statement failed.
*/
TRIGGERED_ACTION_EXCEPTION("09"),
/**
* An attempt was made to modify the target table of the MERGE
statement by a constraint or
* trigger. See also SQLSTATE 09000, 40004.
*/
TRIGGERED_DATA_CHANGE_VIOLATION("27"),
/**
* Completed with a warning.
*/
WARNING("01"),
/**
* The INSERT or UPDATE is not allowed, because a resulting row does
not satisfy the view
* definition.
*/
WITH_CHECK_OPTION_VIOLATION("44");
private final String code;
private static final Map<String, Category> codeToEnum =
Maps.newHashMap();

/**
* Creates a new Category.
*
* @param code the 2-character Category code
*/
Category(String code)
{
this.code = code;
assert (code.length() == 2): code;
}

static
{
for (Category value: values())
codeToEnum.put(value.getCode(), value);
}

/**
* Returns the code associated with the enum.
*
* @return the code
*/
public String getCode()
{
return code;
}

/**
* Returns the Category associated with the specified code.
*
* @param code the category code (2 characters)
* @return the Category
* @throws IllegalArgumentException if no enum value is associated
with the specified code
*/
public static Category fromCode(String code)
{
Category result = codeToEnum.get(code);
if (result == null)
throw new IllegalArgumentException(code);
return result;
}
};
}
-------------------------------
Reply all
Reply to author
Forward
0 new messages