The examples below show some simple methods of how to use SQLSTATEs. These examples are not supposed to be complete or to have a meaningful application, but merely give an idea of how to use SQLSTATEs in different environments.
C and ODBC
void myquery(SQLHANDLE hstmt,char *query)
{
SQLRETUN rc;
rc = SQLExecDirect(hstmt,query,SQL_NTS);
if (rc!=SQL_SUCCESS) {
SQLRETURN rc2;
char SQLSTATE[5+1];
int recnum=1;
do {
rc2 = SQLGetDiagField(SQL_HANDLE_STMT,hstmt,recnum,
SQL_DIAG_SQLSTATE,SQLSTATE,5+1,NULL);
if (SQLSTATE[0]==’2’ && SQLSTATE[1]==’2’) {
printf(“Data error!\n”);
}
recnum++;
} while (rc2==SQL_SUCCESS);
}
...
}
Java and JDBC
class MyClass {
void myquery(Statement stmt,String query) {
try {
boolean results_q = stmt.execute(query);
...
} catch (SQLException e) {
if (e.getSQLState().startsWith(“22”)) {
System.out.println(“Data error!\n”);
}
}
}
}
C and Embedded SQL
exec sql BEGIN DECLARE SECTION;
static char SQLSTATE[6];
exec sql END DECLARE SECTION;
main()
{
exec sql BEGIN DECLARE SECTION;
varchar schema[129];
varchar table [129];
char type [21];
exec sql END DECLARE SECTION;
exec sql DECLARE MYCURSOR CURSOR FOR
SELECT TABLE_SCHEMA,TABLE_NAME,TABLE_TYPE
FROM INFORMATION_SCHEMA.TABLES;
exec sql CONNECT TO '' USER 'SYSADM' USING 'SYSADM';
exec sql OPEN MYCURSOR;
while (1) {
exec sql FETCH MYCURSOR INTO :schema,:table,:type;
if (strcmpn(SQLSTATE,"22",2)==0) {
printf("Data error!\n");
continue;
}
if (strcmp(SQLSTATE, "02000") == 0)
break; /* No more rows */
printf("%s %s %s\n", schema, table, type);
}
exec sql CLOSE MYCURSOR;
exec sql COMMIT;
exec sql DISCONNECT ALL;
exit(0);
}
Throwing User-defined SQLSTATEs in Procedures
create procedure MYPROC(in A integer,in B integer)
begin
-- Input parameter check, and throw an SQLSTATE if wrong.
if A=B then
signal sqlstate ‘22I00’;
end if;
-- Do something useful.
...
end