33.8. ÐбÑабоÑка оÑибок
Ð ÑÑом Ñазделе опиÑÑваеÑÑÑ, как можно обÑабаÑÑваÑÑ Ð¸ÑклÑÑиÑелÑнÑе ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð¸ пÑедÑпÑÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð² пÑогÑамме Ñо вÑÑÑаиваемÑм SQL. ÐÐ»Ñ ÑÑого пÑедназнаÑÐµÐ½Ñ Ð´Ð²Ð° ÑÑедÑÑва, коÑоÑÑе могÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÑÑÑ Ð´ÑÑг дÑÑга.
- Ðожно наÑÑÑоиÑÑ ÑÑнкÑии-обÑабоÑÑики Ð´Ð»Ñ Ð¾Ð±ÑабоÑки пÑедÑпÑеждений и оÑибок, воÑполÑзовавÑиÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹
WHENEVER. - ÐодÑобнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð± оÑибке или пÑедÑпÑеждении можно полÑÑиÑÑ ÑеÑез пеÑеменнÑÑ
sqlca.
33.8.1. УÑÑановка обÑабоÑÑиков
Ðдин пÑоÑÑой меÑод пеÑÐµÑ Ð²Ð°Ñа оÑибок и пÑедÑпÑеждений заклÑÑаеÑÑÑ Ð² назнаÑении опÑеделÑнного дейÑÑвиÑ, коÑоÑое бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð¿Ñи некоÑоÑом ÑÑловии. РобÑем виде:
EXEC SQL WHENEVERÑÑловиедейÑÑвие;
ÐдеÑÑ ÑÑловие Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑледÑÑÑим:
SQLERRORУказанное дейÑÑвие вÑзÑваеÑÑÑ, когда пÑи вÑполнении опеÑаÑоÑа SQL пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¾Ñибка.
SQLWARNINGУказанное дейÑÑвие вÑзÑваеÑÑÑ, когда пÑи вÑполнении опеÑаÑоÑа SQL вÑдаÑÑÑÑ Ð¿ÑедÑпÑеждение.
NOT FOUNDУказанное дейÑÑвие вÑзÑваеÑÑÑ, когда опеÑаÑÐ¾Ñ SQL полÑÑÐ°ÐµÑ Ð¸Ð»Ð¸ обÑабаÑÑÐ²Ð°ÐµÑ Ð½Ð¾Ð»Ñ ÑÑÑок. (ÐÑо обÑÑоÑÑелÑÑÑво не ÑÑиÑаеÑÑÑ Ð¾Ñибкой, но бÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ оÑÑледиÑÑ ÐµÐ³Ð¾.)
дейÑÑвие Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑледÑÑÑим:
CONTINUEÐÑо ÑакÑиÑеÑки ознаÑаеÑ, ÑÑо ÑÑловие игноÑиÑÑеÑÑÑ. ÐÑо поведение по ÑмолÑаниÑ.
GOTOмеÑкаGO TOмеÑкаÐеÑейÑи к Ñказанной меÑке (иÑполÑзÑÑ Ð¾Ð¿ÐµÑаÑоÑ
gotoÑзÑка C).SQLPRINTÐÑвеÑÑи ÑообÑение в ÑÑÑÑойÑÑво ÑÑандаÑÑного вÑвода. ÐÑо полезно Ð´Ð»Ñ Ð¿ÑоÑÑÑÑ Ð¿ÑогÑамм или пÑи ÑазÑабоÑке пÑоÑоÑипов. СодеÑжание ÑÑого ÑообÑÐµÐ½Ð¸Ñ Ð½Ðµ наÑÑÑаиваеÑÑÑ.
STOPÐÑзваÑÑ
exit(1), ÑÑо пÑиведÑÑ Ðº завеÑÑÐµÐ½Ð¸Ñ Ð¿ÑогÑаммÑ.DO BREAKÐÑполниÑÑ Ð¾Ð¿ÐµÑаÑоÑ
breakÑзÑка C. ÐÑÐ¾Ñ Ð²Ð°ÑÐ¸Ð°Ð½Ñ ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ ÑолÑко в ÑÐ¸ÐºÐ»Ð°Ñ Ð¸Ð»Ð¸ опеÑаÑоÑаÑswitch.CALLимÑ(аÑгÑменÑÑ)DOимÑ(аÑгÑменÑÑ)ÐÑзваÑÑ ÑказаннÑе ÑÑнкÑии C Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñми аÑгÑменÑами.
Ð ÑÑандаÑÑе SQL опиÑÐ°Ð½Ñ ÑолÑко дейÑÑÐ²Ð¸Ñ CONTINUE и GOTO (и GO TO).
Ðиже показан пÑоÑÑой пÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑÐ¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´. ÐÑа конÑÑÑÑкÑÐ¸Ñ Ð²ÑÐ²Ð¾Ð´Ð¸Ñ Ð¿ÑоÑÑое ÑообÑение пÑи вÑдаÑе пÑедÑпÑÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¸ пÑеÑÑÐ²Ð°ÐµÑ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ð² ÑлÑÑае оÑибки:
EXEC SQL WHENEVER SQLWARNING SQLPRINT; EXEC SQL WHENEVER SQLERROR STOP;
ÐпеÑаÑÐ¾Ñ EXEC SQL WHENEVER ÑвлÑеÑÑÑ Ð´Ð¸ÑекÑивой пÑепÑоÑеÑÑоÑа SQL, а не опеÑаÑоÑом ÑзÑка C. УÑÑанавливаемое им дейÑÑвие пÑи оÑибкаÑ
или пÑедÑпÑеждениÑÑ
пÑименÑеÑÑÑ ÐºÐ¾ вÑем вÑÑÑаиваемÑм опеÑаÑоÑам SQL ниже ÑоÑки, где ÑÑÑанавливаеÑÑÑ Ð¾Ð±ÑабоÑÑик, еÑли ÑолÑко ÑÑо дейÑÑвие не бÑло изменено поÑле пеÑвой ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ EXEC SQL WHENEVER, и до SQL-опеÑаÑоÑа, вÑзвавÑего ÑÑо ÑÑловие, вне завиÑимоÑÑи Ð¾Ñ Ñ
ода вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑогÑÐ°Ð¼Ð¼Ñ Ð½Ð° C. ÐоÑÑÐ¾Ð¼Ñ Ð¾Ð±Ðµ ÑледÑÑÑие пÑогÑÐ°Ð¼Ð¼Ñ Ð½Ð° C не дадÑÑ Ð¶ÐµÐ»Ð°ÐµÐ¼Ð¾Ð³Ð¾ ÑÑÑекÑа:
/*
* ÐÐÐÐ ÐÐÐÐЬÐÐ
*/
int main(int argc, char *argv[])
{
...
if (verbose) {
EXEC SQL WHENEVER SQLWARNING SQLPRINT;
}
...
EXEC SQL SELECT ...;
...
}/*
* ÐÐÐÐ ÐÐÐÐЬÐÐ
*/
int main(int argc, char *argv[])
{
...
set_error_handler();
...
EXEC SQL SELECT ...;
...
}
static void set_error_handler(void)
{
EXEC SQL WHENEVER SQLERROR STOP;
}33.8.2. sqlca
ÐÐ»Ñ Ð±Ð¾Ð»ÐµÐµ гибкой обÑабоÑки оÑибок в инÑеÑÑейÑе вÑÑÑаиваемого SQL пÑедÑÑавлена глобалÑÐ½Ð°Ñ Ð¿ÐµÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ sqlca (SQL Communication Area, ÐблаÑÑÑ Ñведений SQL), имеÑÑÐ°Ñ ÑледÑÑÑÑÑ ÑÑÑÑкÑÑÑÑ:
struct
{
char sqlcaid[8];
long sqlabc;
long sqlcode;
struct
{
int sqlerrml;
char sqlerrmc[SQLERRMC_LEN];
} sqlerrm;
char sqlerrp[8];
long sqlerrd[6];
char sqlwarn[8];
char sqlstate[5];
} sqlca; (РмногопоÑоÑной пÑогÑамме каждÑй поÑок авÑомаÑиÑеÑки полÑÑÐ°ÐµÑ ÑобÑÑвеннÑÑ ÐºÐ¾Ð¿Ð¸Ñ sqlca. ÐÑо ÑабоÑÐ°ÐµÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ ÑÑандаÑÑной в C глобалÑной пеÑеменной errno.)
СÑÑÑкÑÑÑа sqlca покÑÑÐ²Ð°ÐµÑ Ð¸ пÑедÑпÑеждениÑ, и оÑибки. ÐÑли в пÑоÑеÑÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑа вÑдаÑÑÑÑ Ð½ÐµÑколÑко пÑедÑпÑеждений или оÑибок, sqlca бÑÐ´ÐµÑ ÑодеÑжаÑÑ ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ ÑолÑко о поÑледнем(ей) из ниÑ
.
ÐÑли поÑледний опеÑаÑÐ¾Ñ SQL вÑполнÑеÑÑÑ Ð±ÐµÐ· оÑибки, sqlca.sqlcode бÑÐ´ÐµÑ ÑодеÑжаÑÑ 0, а sqlca.sqlstate â "00000". ÐÑли вÑдаÑÑÑÑ Ð¿ÑедÑпÑеждение или оÑибка, в sqlca.sqlcode бÑÐ´ÐµÑ ÑодеÑжаÑÑÑÑ Ð¾ÑÑиÑаÑелÑное ÑиÑло, а sqlca.sqlstate бÑÐ´ÐµÑ Ð¾ÑлиÑаÑÑÑÑ Ð¾Ñ "00000". ÐоложиÑелÑное знаÑение sqlca.sqlcode ÑÑÑанавливаеÑÑÑ Ð¿Ñи нейÑÑалÑном ÑобÑÑии, напÑимеÑ, когда поÑледний запÑÐ¾Ñ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð½Ð¾Ð»Ñ ÑÑÑок. ÐÐ¾Ð»Ñ sqlcode и sqlstate пÑедÑÑавлÑÑÑ Ð´Ð²Ðµ ÑазлиÑнÑе ÑÑ
ÐµÐ¼Ñ ÐºÐ¾Ð´Ð¾Ð² оÑибок; подÑобнее они опиÑÐ°Ð½Ñ Ð½Ð¸Ð¶Ðµ.
ÐÑли поÑледний опеÑаÑÐ¾Ñ SQL бÑл ÑÑпеÑнÑм, в sqlca.sqlerrd[1] ÑодеÑжиÑÑÑ OID обÑабоÑанной ÑÑÑоки (еÑли ÑÑо ÑмеÑÑно), а в sqlca.sqlerrd[2] колиÑеÑÑво обÑабоÑаннÑÑ
или возвÑаÑÑннÑÑ
ÑÑÑок (еÑли ÑÑо ÑмеÑÑно Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ).
Ð ÑлÑÑае оÑибки или пÑедÑпÑÐµÐ¶Ð´ÐµÐ½Ð¸Ñ sqlca.sqlerrm.sqlerrmc бÑÐ´ÐµÑ ÑодеÑжаÑÑ ÑÑÑокÑ, опиÑÑваÑÑÑÑ Ð¾ÑибкÑ. Ðоле sqlca.sqlerrm.sqlerrml ÑодеÑÐ¶Ð¸Ñ Ð´Ð»Ð¸Ð½Ñ ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибке, коÑоÑое Ñ
ÑаниÑÑÑ Ð² sqlca.sqlerrm.sqlerrmc (ÑезÑлÑÑÐ°Ñ ÑÑнкÑии strlen(), коÑоÑÑй не оÑÐµÐ½Ñ Ð¸Ð½ÑеÑеÑен Ð´Ð»Ñ Ð¿ÑогÑаммиÑÑа C). ÐамеÑÑÑе, ÑÑо некоÑоÑÑе ÑообÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð½Ðµ ÑмеÑаÑÑÑÑ Ð² маÑÑив sqlerrmc ÑикÑиÑованного ÑазмеÑа; они бÑдÑÑ Ð¾Ð±ÑезаÑÑÑÑ.
Ð ÑлÑÑае пÑедÑпÑеждениÑ, в sqlca.sqlwarn[2] запиÑÑваеÑÑÑ Ñимвол W. (Ðо вÑеÑ
дÑÑгиÑ
ÑлÑÑаÑÑ
знаÑение бÑÐ´ÐµÑ Ð¾ÑлиÑнÑм Ð¾Ñ W.) Символ W в sqlca.sqlwarn[1] показÑваеÑ, ÑÑо знаÑение бÑло обÑезано пÑи ÑоÑ
Ñанении в пеÑеменной ÑÑедÑ. W в sqlca.sqlwarn[0] ÑÑÑанавливаеÑÑÑ, еÑли пÑедÑпÑеждение оÑмеÑаеÑÑÑ Ð² каком-либо дÑÑгом ÑлеменÑе маÑÑива.
ÐÐ¾Ð»Ñ sqlcaid, sqlabc, sqlerrp и оÑÑалÑнÑе ÑлеменÑÑ sqlerrd и sqlwarn в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð½Ðµ ÑодеÑÐ¶Ð°Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾Ð¹ инÑоÑмаÑии.
СÑÑÑкÑÑÑа sqlca не опÑеделена в ÑÑандаÑÑе SQL, но Ñеализована в неÑколÑкиÑ
дÑÑгиÑ
СУÐÐ SQL. ÐÑинÑипиалÑно она опÑеделÑеÑÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾, но еÑли Ð²Ñ Ñ
оÑиÑе, ÑÑÐ¾Ð±Ñ Ð²Ð°Ñи пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð±Ñли пеÑеноÑимÑми, ÑÑаÑелÑно изÑÑиÑе ÑазлиÑÐ¸Ñ ÑеализаÑий.
Ð ÑледÑÑÑем пÑимеÑе, демонÑÑÑиÑÑÑÑем пÑименение WHENEVER в ÑоÑеÑании Ñ sqlca, вÑводиÑÑÑ ÑодеÑжимое sqlca пÑи возникновении оÑибки. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ Ð´Ð»Ñ Ð¾Ñладки или в пÑоÑоÑипаÑ
, пока не Ñеализован более «дÑÑжеÑÑвеннÑй полÑзоваÑелÑ» обÑабоÑÑик оÑибок.
EXEC SQL WHENEVER SQLERROR CALL print_sqlca();
void
print_sqlca()
{
fprintf(stderr, "==== sqlca ====\n");
fprintf(stderr, "sqlcode: %ld\n", sqlca.sqlcode);
fprintf(stderr, "sqlerrm.sqlerrml: %d\n", sqlca.sqlerrm.sqlerrml);
fprintf(stderr, "sqlerrm.sqlerrmc: %s\n", sqlca.sqlerrm.sqlerrmc);
fprintf(stderr, "sqlerrd: %ld %ld %ld %ld %ld %ld\n", sqlca.sqlerrd[0],sqlca.sqlerrd[1],sqlca.sqlerrd[2],
sqlca.sqlerrd[3],sqlca.sqlerrd[4],sqlca.sqlerrd[5]);
fprintf(stderr, "sqlwarn: %d %d %d %d %d %d %d %d\n", sqlca.sqlwarn[0], sqlca.sqlwarn[1], sqlca.sqlwarn[2],
sqlca.sqlwarn[3], sqlca.sqlwarn[4], sqlca.sqlwarn[5],
sqlca.sqlwarn[6], sqlca.sqlwarn[7]);
fprintf(stderr, "sqlstate: %5s\n", sqlca.sqlstate);
fprintf(stderr, "===============\n");
}РезÑлÑÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑглÑдеÑÑ ÑледÑÑÑим обÑазом (пÑи оÑибке, вÑзванной опеÑаÑкой в имени ÑаблиÑÑ):
==== sqlca ==== sqlcode: -400 sqlerrm.sqlerrml: 49 sqlerrm.sqlerrmc: relation "pg_databasep" does not exist on line 38 sqlerrd: 0 0 0 0 0 0 sqlwarn: 0 0 0 0 0 0 0 0 sqlstate: 42P01 ===============
33.8.3. SQLSTATE и SQLCODE
ÐÐ¾Ð»Ñ sqlca.sqlstate и sqlca.sqlcode оÑÑажаÑÑ Ð´Ð²Ðµ ÑазлиÑнÑе ÑÑ
емÑ, пÑедÑÑавлÑÑÑие ÐºÐ¾Ð´Ñ Ð¾Ñибок. Ðбе ÑÑ
ÐµÐ¼Ñ Ð¿ÑиÑли из ÑÑандаÑÑа SQL, но ÑÑ
ема SQLCODE бÑла пÑизнана ÑÑÑаÑевÑей в ÑедакÑии SQL-92 и иÑклÑÑена в поÑледÑÑÑиÑ
ÑедакÑиÑÑ
. ÐоÑÑÐ¾Ð¼Ñ Ð² новÑÑ
пÑиложениÑÑ
наÑÑоÑÑелÑно ÑекомендÑеÑÑÑ Ð¸ÑполÑзоваÑÑ SQLSTATE.
SQLSTATE задаÑÑÑÑ Ð² маÑÑиве из пÑÑи Ñимволов. ÐÑи пÑÑÑ Ñимволов ÑодеÑÐ¶Ð°Ñ ÑиÑÑÑ Ð¸Ð»Ð¸ бÑÐºÐ²Ñ Ð² веÑÑ
нем ÑегиÑÑÑе, пÑедÑÑавлÑÑÑие ÐºÐ¾Ð´Ñ ÑазлиÑнÑÑ
ÑÑловий оÑибок и пÑедÑпÑеждений. SQLSTATE опÑеделÑеÑÑÑ Ð¿Ð¾ иеÑаÑÑ
иÑеÑкой ÑÑ
еме: пеÑвÑе два Ñимвола обознаÑаÑÑ Ð¾Ð±Ñий клаÑÑ ÑÑловиÑ, а ÑледÑÑÑие ÑÑи â подклаÑÑ Ð¾Ð±Ñего ÑÑловиÑ. УÑпеÑное ÑоÑÑоÑние обознаÑаеÑÑÑ ÐºÐ¾Ð´Ð¾Ð¼ 00000. Ðо болÑÑей ÑаÑÑи ÐºÐ¾Ð´Ñ SQLSTATE опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð² ÑÑандаÑÑе SQL. СеÑÐ²ÐµÑ Postgres Pro поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÐºÐ¾Ð´Ñ Ð¾Ñибок SQLSTATE еÑÑеÑÑвеннÑм обÑазом; поÑÑÐ¾Ð¼Ñ Ð¸ÑполÑзÑÑ Ð²Ð¾ вÑеÑ
пÑиложениÑÑ
именно ÑÑÑ ÑÑ
ÐµÐ¼Ñ ÐºÐ¾Ð´Ð¾Ð² оÑибок, можно добиÑÑÑÑ Ð²ÑÑокой ÑÑепени ÑоглаÑованноÑÑи. Ðа далÑнейÑими ÑведениÑми обÑаÑиÑеÑÑ Ðº ÐÑиложениÑ A.
SQLCODE â ÑÑÑаÑевÑÐ°Ñ ÑÑ
ема, в коÑоÑой ÐºÐ¾Ð´Ñ Ð¾Ñибок пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ñ Ð¿ÑоÑÑо ÑелÑми ÑиÑлами. ÐнаÑение 0 обознаÑÐ°ÐµÑ ÑÑпеÑное завеÑÑение, положиÑелÑное знаÑение â ÑÑпеÑное завеÑÑение Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑной инÑоÑмаÑией, а оÑÑиÑаÑелÑное говоÑÐ¸Ñ Ð¾Ð± оÑибке. Ð ÑÑандаÑÑе SQL опÑеделено ÑолÑко положиÑелÑное знаÑение +100, показÑваÑÑее, ÑÑо поÑледнÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° веÑнÑла или заÑÑонÑла Ð½Ð¾Ð»Ñ ÑÑÑок, но оÑÑиÑаÑелÑнÑе знаÑÐµÐ½Ð¸Ñ Ð½Ðµ опÑеделенÑ. Таким обÑазом, Ñ ÑÑой ÑÑ
емой нелÑÐ·Ñ ÑаÑÑÑиÑÑваÑÑ Ð½Ð° пеÑеноÑимоÑÑÑ Ð¸ она не Ð¸Ð¼ÐµÐµÑ Ð¸ÐµÑаÑÑ
иÑеÑкой ÑÑÑÑкÑÑÑÑ. ÐÑÑоÑиÑеÑки ÑложилоÑÑ, ÑÑо пÑоÑеÑÑÐ¾Ñ Ð²ÑÑÑаиваемого SQL Ð´Ð»Ñ Postgres Pro назнаÑÐ°ÐµÑ Ð½ÐµÐºÐ¾ÑоÑÑе опÑеделÑннÑе знаÑÐµÐ½Ð¸Ñ SQLCODE Ð´Ð»Ñ ÑобÑÑвенного иÑполÑзованиÑ; они пеÑеÑиÑÐ»ÐµÐ½Ñ Ð½Ð¸Ð¶Ðµ Ñ ÑиÑловÑми знаÑениÑми и ÑимволÑнÑми именами. ÐомниÑе, ÑÑо ÑÑи ÐºÐ¾Ð´Ñ Ð½ÐµÑовмеÑÑÐ¸Ð¼Ñ Ñ Ð´ÑÑгими ÑеализаÑиÑми SQL. ÐоÑÑÐ¾Ð¼Ñ Ð´Ð»Ñ ÑпÑоÑÐµÐ½Ð¸Ñ Ð¿ÐµÑевода пÑиложений на ÑÑ
ÐµÐ¼Ñ SQLSTATE вмеÑÑе Ñ ÑÑими кодами пеÑеÑиÑлÑÑÑÑÑ ÑооÑвеÑÑÑвÑÑÑие знаÑÐµÐ½Ð¸Ñ SQLSTATE. Ðднако однознаÑного ÑооÑвеÑÑÑÐ²Ð¸Ñ Ð¾Ð´Ð¸Ð½-к-Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¸Ð»Ð¸ один-ко-многим Ð¼ÐµÐ¶Ð´Ñ ÑÑими двÑÐ¼Ñ ÑÑ
емами не ÑÑÑеÑÑвÑÐµÑ (на Ñамом деле ÑÑо ÑооÑвеÑÑÑвие многие-ко-многим), поÑÑÐ¾Ð¼Ñ ÑледÑÐµÑ ÑвеÑиÑÑÑÑ Ñо ÑпиÑком SQLSTATE в ÐÑиложении A в каждом ÑлÑÑае.
SQLCODE Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ ÑледÑÑÑие знаÑениÑ:
- 0 (
ECPG_NO_ERROR) ÐоказÑваеÑ, ÑÑо оÑибки неÑ. (SQLSTATE 00000)
- 100 (
ECPG_NOT_FOUND) ÐÑо нейÑÑалÑное ÑÑловие, показÑваÑÑее, ÑÑо поÑледнÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° веÑнÑла или обÑабоÑала Ð½Ð¾Ð»Ñ ÑÑÑок, либо кÑÑÑÐ¾Ñ Ð´Ð¾ÑÑиг конÑа. (SQLSTATE 02000)
ÐÑбиÑÐ°Ñ Ð´Ð°Ð½Ð½Ñе из кÑÑÑоÑа в Ñикле, можно пÑовеÑÑÑÑ ÑÑÐ¾Ñ ÐºÐ¾Ð´, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð½ÑÑÑ, когда нÑжно пÑеÑваÑÑ Ñикл, ÑледÑÑÑим обÑазом:
while (1) { EXEC SQL FETCH ... ; if (sqlca.sqlcode == ECPG_NOT_FOUND) break; }Ðо
WHENEVER NOT FOUND DO BREAKвнÑÑÑи по ÑÑÑи Ð´ÐµÐ»Ð°ÐµÑ ÑÑо же, поÑÑÐ¾Ð¼Ñ Ñакое Ñвное ÑÑловие обÑÑно ниÑем не лÑÑÑе.- -12 (
ECPG_OUT_OF_MEMORY) УказÑваеÑ, ÑÑо законÑилаÑÑ Ð²Ð¸ÑÑÑалÑÐ½Ð°Ñ Ð¿Ð°Ð¼ÑÑÑ. ЧиÑловое знаÑение опÑеделено как
-ENOMEM. (SQLSTATE YE001)- -200 (
ECPG_UNSUPPORTED) УказÑваеÑ, ÑÑо пÑепÑоÑеÑÑÐ¾Ñ ÑгенеÑиÑовал код, коÑоÑÑй не Ð¿Ð¾Ð½Ð¸Ð¼Ð°ÐµÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñека. Ðозможно, Ð²Ñ Ð¸ÑполÑзÑеÑе неÑовмеÑÑимÑе веÑÑии пÑепÑоÑеÑÑоÑа и библиоÑеки. (SQLSTATE YE002)
- -201 (
ECPG_TOO_MANY_ARGUMENTS) ÐÑо ознаÑаеÑ, ÑÑо в команде бÑло Ñказано болÑÑе пеÑеменнÑÑ ÑÑедÑ, Ñем она ожидаеÑ. (SQLSTATE 07001 или 07002)
- -202 (
ECPG_TOO_FEW_ARGUMENTS) ÐÑо ознаÑаеÑ, ÑÑо в команде бÑло Ñказано менÑÑе пеÑеменнÑÑ ÑÑедÑ, Ñем она ожидаеÑ. (SQLSTATE 07001 или 07002)
- -203 (
ECPG_TOO_MANY_MATCHES) ÐÑо ознаÑаеÑ, ÑÑо запÑÐ¾Ñ Ð²ÐµÑнÑл неÑколÑко ÑÑÑок, но опеÑаÑÐ¾Ñ Ð±Ñл подгоÑовлен ÑолÑко Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÑоки ÑезÑлÑÑаÑа (напÑимеÑ, поÑÐ¾Ð¼Ñ ÑÑо пеÑеданнÑе пеÑеменнÑе â не маÑÑивÑ). (SQLSTATE 21000)
- -204 (
ECPG_INT_FORMAT) ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑÑÐµÐ´Ñ Ñипа
intи даннÑе в базе имеÑÑ ÑазнÑе ÑипÑ, и в ÑÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ ÑодеÑжиÑÑÑ Ð·Ð½Ð°Ñение, коÑоÑое нелÑÐ·Ñ Ð¿ÑеобÑазоваÑÑ Ð²int. ÐÐ»Ñ ÑÑого пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñека иÑполÑзÑÐµÑ ÑÑнкÑиÑstrtol(). (SQLSTATE 42804)- -205 (
ECPG_UINT_FORMAT) ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑÑÐµÐ´Ñ Ñипа
unsigned intи даннÑе в базе имеÑÑ ÑазнÑе ÑипÑ, и в ÑÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ ÑодеÑжиÑÑÑ Ð·Ð½Ð°Ñение, коÑоÑое нелÑÐ·Ñ Ð¿ÑеобÑазоваÑÑ Ð²unsigned int. ÐÐ»Ñ ÑÑого пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñека иÑполÑзÑÐµÑ ÑÑнкÑиÑstrtoul(). (SQLSTATE 42804)- -206 (
ECPG_FLOAT_FORMAT) ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑÑÐµÐ´Ñ Ñипа
floatи даннÑе в базе имеÑÑ ÑазнÑе ÑипÑ, и в ÑÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ ÑодеÑжиÑÑÑ Ð·Ð½Ð°Ñение, коÑоÑое нелÑÐ·Ñ Ð¿ÑеобÑазоваÑÑ Ð²Ð¾float. ÐÐ»Ñ ÑÑого пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñека иÑполÑзÑÐµÑ ÑÑнкÑиÑstrtod(). (SQLSTATE 42804)- -207 (
ECPG_NUMERIC_FORMAT) ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑÑÐµÐ´Ñ Ñипа
numericи даннÑе в базе имеÑÑ ÑазнÑе ÑипÑ, и в ÑÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ ÑодеÑжиÑÑÑ Ð·Ð½Ð°Ñение, коÑоÑое нелÑÐ·Ñ Ð¿ÑеобÑазоваÑÑ Ð²numeric. (SQLSTATE 42804)- -208 (
ECPG_INTERVAL_FORMAT) ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑÑÐµÐ´Ñ Ñипа
intervalи даннÑе в базе имеÑÑ ÑазнÑе ÑипÑ, и в ÑÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ ÑодеÑжиÑÑÑ Ð·Ð½Ð°Ñение, коÑоÑое нелÑÐ·Ñ Ð¿ÑеобÑазоваÑÑ Ð²interval. (SQLSTATE 42804)- -209 (
ECPG_DATE_FORMAT) ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑÑÐµÐ´Ñ Ñипа
dateи даннÑе в базе имеÑÑ ÑазнÑе ÑипÑ, и в ÑÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ ÑодеÑжиÑÑÑ Ð·Ð½Ð°Ñение, коÑоÑое нелÑÐ·Ñ Ð¿ÑеобÑазоваÑÑ Ð²date. (SQLSTATE 42804)- -210 (
ECPG_TIMESTAMP_FORMAT) ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑÑÐµÐ´Ñ Ñипа
timestampи даннÑе в базе имеÑÑ ÑазнÑе ÑипÑ, и в ÑÑÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ ÑодеÑжиÑÑÑ Ð·Ð½Ð°Ñение, коÑоÑое нелÑÐ·Ñ Ð¿ÑеобÑазоваÑÑ Ð²timestamp. (SQLSTATE 42804)- -211 (
ECPG_CONVERT_BOOL) ÐÑо ознаÑаеÑ, ÑÑо пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑÑÐµÐ´Ñ Ð¸Ð¼ÐµÐµÑ Ñип
bool, а знаÑение в базе даннÑÑ Ð¾ÑлиÑаеÑÑÑ Ð¾Ñ't'или'f'. (SQLSTATE 42804)- -212 (
ECPG_EMPTY) СеÑвеÑÑ Postgres Pro бÑл пеÑедан пÑÑÑой опеÑаÑоÑ. (ÐÑого обÑÑно не должно пÑоиÑÑ Ð¾Ð´Ð¸ÑÑ Ð² пÑогÑамме Ñо вÑÑÑаиваемÑм SQL, Ñак ÑÑо ÑÑо Ð¼Ð¾Ð¶ÐµÑ ÑказÑваÑÑ Ð½Ð° внÑÑÑеннÑÑ Ð¾ÑибкÑ.) (SQLSTATE YE002)
- -213 (
ECPG_MISSING_INDICATOR) ÐозвÑаÑено знаÑение NULL, но пеÑеменнаÑ-индикаÑÐ¾Ñ NULL не задана. (SQLSTATE 22002)
- -214 (
ECPG_NO_ARRAY) Там, где ÑÑебÑеÑÑÑ Ð¼Ð°ÑÑив, бÑла пеÑедана обÑÑÐ½Ð°Ñ Ð¿ÐµÑеменнаÑ. (SQLSTATE 42804)
- -215 (
ECPG_DATA_NOT_ARRAY) Ðаза даннÑÑ Ð²Ð¾Ð·Ð²ÑаÑила обÑÑнÑÑ Ð¿ÐµÑеменнÑÑ Ñам, где ÑÑебÑеÑÑÑ Ð·Ð½Ð°Ñение-маÑÑив. (SQLSTATE 42804)
- -216 (
ECPG_ARRAY_INSERT) Ðе ÑдалоÑÑ Ð²ÑÑавиÑÑ Ð·Ð½Ð°Ñение в маÑÑив. (SQLSTATE 42804)
- -220 (
ECPG_NO_CONN) ÐÑогÑамма попÑÑалаÑÑ Ð¸ÑполÑзоваÑÑ Ð½ÐµÑÑÑеÑÑвÑÑÑее подклÑÑение. (SQLSTATE 08003)
- -221 (
ECPG_NOT_CONN) ÐÑогÑамма попÑÑалаÑÑ Ð¸ÑполÑзоваÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑение, коÑоÑое ÑÑÑеÑÑвÑеÑ, но не бÑло оÑкÑÑÑо. (ÐÑо внÑÑÑеннÑÑ Ð¾Ñибка.) (SQLSTATE YE002)
- -230 (
ECPG_INVALID_STMT) ÐпеÑаÑоÑ, коÑоÑÑй Ð²Ñ Ð¿ÑÑаеÑеÑÑ Ð²ÑполниÑÑ, не бÑл подгоÑовлен. (SQLSTATE 26000)
- -239 (
ECPG_INFORMIX_DUPLICATE_KEY) ÐÑибка повÑоÑÑÑÑегоÑÑ ÐºÐ»ÑÑа, наÑÑÑение огÑаниÑÐµÐ½Ð¸Ñ ÑникалÑноÑÑи (Ñежим ÑовмеÑÑимоÑÑи Ñ Informix). (SQLSTATE 23505)
- -240 (
ECPG_UNKNOWN_DESCRIPTOR) УказаннÑй деÑкÑипÑÐ¾Ñ Ð½Ðµ найден. ÐпеÑаÑоÑ, коÑоÑÑй Ð²Ñ Ð¿ÑÑаеÑеÑÑ Ð¸ÑполÑзоваÑÑ, не бÑл подгоÑовлен. (SQLSTATE 33000)
- -241 (
ECPG_INVALID_DESCRIPTOR_INDEX) УказаннÑй Ð¸Ð½Ð´ÐµÐºÑ Ð´ÐµÑкÑипÑоÑа вне диапазона. (SQLSTATE 07009)
- -242 (
ECPG_UNKNOWN_DESCRIPTOR_ITEM) ÐапÑоÑен невеÑнÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð´ÐµÑкÑипÑоÑа. (ÐÑо внÑÑÑеннÑÑ Ð¾Ñибка.) (SQLSTATE YE002)
- -243 (
ECPG_VAR_NOT_NUMERIC) ÐÑи вÑполнении динамиÑеÑкого опеÑаÑоÑа база даннÑÑ Ð²Ð¾Ð·Ð²ÑаÑила ÑиÑловое знаÑение, Ñогда как пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑÑÐµÐ´Ñ â не ÑиÑловаÑ. (SQLSTATE 07006)
- -244 (
ECPG_VAR_NOT_CHAR) ÐÑи вÑполнении динамиÑеÑкого опеÑаÑоÑа база даннÑÑ Ð²Ð¾Ð·Ð²ÑаÑила не ÑиÑловое знаÑение, Ñогда как пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑÑÐµÐ´Ñ â ÑиÑловаÑ. (SQLSTATE 07006)
- -284 (
ECPG_INFORMIX_SUBSELECT_NOT_ONE) РезÑлÑÑÐ°Ñ Ð¿Ð¾Ð´Ð·Ð°Ð¿ÑоÑа пÑедÑÑавлен не одной ÑÑÑокой (Ñежим ÑовмеÑÑимоÑÑи Ñ Informix). (SQLSTATE 21000)
- -400 (
ECPG_PGSQL) ÐÑибка пÑоизоÑла на ÑÑоÑоне ÑеÑвеÑа Postgres Pro. Ð ÑекÑÑе оÑибки ÑодеÑжиÑÑÑ ÑообÑение об оÑибке Ð¾Ñ ÑеÑвеÑа Postgres Pro.
- -401 (
ECPG_TRANS) СеÑÐ²ÐµÑ Postgres Pro ÑообÑаеÑ, ÑÑо ÐºÐ»Ð¸ÐµÐ½Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¿ÑÑкаÑÑ, ÑикÑиÑоваÑÑ Ð¸Ð»Ð¸ оÑменÑÑÑ ÑÑанзакÑиÑ. (SQLSTATE 08007)
- -402 (
ECPG_CONNECT) ÐопÑÑка подклÑÑÐµÐ½Ð¸Ñ Ðº базе даннÑÑ Ð±Ñла неÑдаÑной. (SQLSTATE 08001)
- -403 (
ECPG_DUPLICATE_KEY) ÐÑибка повÑоÑÑÑÑегоÑÑ ÐºÐ»ÑÑа, наÑÑÑение огÑаниÑÐµÐ½Ð¸Ñ ÑникалÑноÑÑи. (SQLSTATE 23505)
- -404 (
ECPG_SUBSELECT_NOT_ONE) РезÑлÑÑÐ°Ñ Ð¿Ð¾Ð´Ð·Ð°Ð¿ÑоÑа пÑедÑÑавлен не одной ÑÑÑокой. (SQLSTATE 21000)
- -602 (
ECPG_WARNING_UNKNOWN_PORTAL) Указано невеÑное Ð¸Ð¼Ñ ÐºÑÑÑоÑа. (SQLSTATE 34000)
- -603 (
ECPG_WARNING_IN_TRANSACTION) ТÑанзакÑÐ¸Ñ Ð² пÑоÑеÑÑе вÑполнениÑ. (SQLSTATE 25001)
- -604 (
ECPG_WARNING_NO_TRANSACTION) ÐÐµÑ Ð°ÐºÑивной (вÑполнÑÑÑейÑÑ) ÑÑанзакÑии. (SQLSTATE 25P01)
- -605 (
ECPG_WARNING_PORTAL_EXISTS) ÐÑло Ñказано Ð¸Ð¼Ñ ÑÑÑеÑÑвÑÑÑего кÑÑÑоÑа. (SQLSTATE 42P03)