int ociw_query_result(db_wrap * self, char const * sql, size_t len, db_wrap_result ** tgt) { CONN_DECL(DB_WRAP_E_BAD_ARG); if (! sql || !*sql || !len || !tgt) return DB_WRAP_E_BAD_ARG; OCI_Statement * st = OCI_StatementCreate(ociconn); if (! st) { lerr("Creation of OCI_Statement failed.\n"); return DB_WRAP_E_CHECK_DB_ERROR; } db_wrap_result * wres = (db_wrap_result*)malloc(sizeof(db_wrap_result)); if (! wres) return DB_WRAP_E_ALLOC_ERROR; *wres = ociw_res_empty; ociw_result_impl * impl = (ociw_result_impl*)malloc(sizeof(ociw_result_impl)); if (! impl) { OCI_StatementFree(st); free(wres); return DB_WRAP_E_ALLOC_ERROR; } *impl = ociw_result_impl_empty; impl->st = st; wres->impl.data = impl; #if 1 if (! OCI_ExecuteStmt(st, sql)) { wres->api->finalize(wres); /* i don't quite know why, but fetching the OCI error state after this returns a 0 error code and empty error string. */ return DB_WRAP_E_CHECK_DB_ERROR; } #else if (! //OCI_ExecuteStmt(st, sql) OCI_Prepare(st, sql) ) { lerr("Preparation of OCI_Statement failed: [%s]\n",OCI_GetSql(st)); wres->api->finalize(wres); return DB_WRAP_E_CHECK_DB_ERROR; } if (! OCI_Execute(st)) { lerr("Execution of prepared OCI_Statement failed: [%s]\n",OCI_GetSql(st)); wres->api->finalize(wres); return DB_WRAP_E_CHECK_DB_ERROR; } #endif impl->result = OCI_GetResultset(st) /* MIGHT be null - the docs are not really clear here what happens on an empty result set. */ ; *tgt = wres; return 0; }
static void oci_err_handler(OCI_Error *err) { ociw_error_info_kludge.sql = OCI_GetSql(OCI_ErrorGetStatement(err)); ociw_error_info_kludge.errorString = OCI_ErrorGetString(err); ociw_error_info_kludge.ociCode = OCI_ErrorGetOCICode(err); }
void err_handler(OCI_Error *err) { printf( "code : ORA-%05i\n" "msg : %s\n" "sql : %s\n", OCI_ErrorGetOCICode(err), OCI_ErrorGetString(err), OCI_GetSql(OCI_ErrorGetStatement(err)) ); }