29.9. ������

���������������Ƕ��� SQL �����ﴦ�������Լ����档�кü��ַ���������ʩ���á�

29.9.1. ���ûص�

�������;����һ���򵥵İ취������һ���ض��Ķ����� ���ض����������ʱ��ִ�����������ͨ����

EXEC SQL WHENEVER condition action;

condition ����������֮һ��

SQLERROR

�����Ķ�������ִ��һ�� SQL ��䷢�������ʱ��ִ�С�

SQLWARNING

�����Ķ�������ִ��һ�� SQL ��䷢�������ʱ��ִ�С�

NOT FOUND

�����Ķ�������һ�� SQL �����������л���Ӱ�����е�����±� ִ�С��������������һ�����󣬵��������ϲ��������������������

action ����������֮һ��

CONTINUE

�����������˼������������Ժ��ԡ�����ȱʡ��

GOTO label
GO TO label

��ת��ָ���ı�ǩ��ʹ��һ�� C ��goto ��䣩��

SQLPRINT

���׼�����ӡһ����Ϣ����Լ򵥳������ԭ�Ͷ����������á� ��Ϣ��ϸ�ڲ������á�

STOP

���� exit(1)��������ֹ�������С�

BREAK

ִ�� C ��� break�����Ӧ��ֻ��ѭ������ switch �����ʹ�á�

CALL name (args)
DO name (args)

��ָ���IJ�������ָ���� C ������

SQL ��׼ֻ�ṩ CONTINUE �� GOTO ��Ҳ�� GO TO��������

������һ�����ӣ�����ܿ������ڼ򵥵ij�������ڷ��������ʱ���ӡһ���򵥵���Ϣ���ڷ��������ʱ���˳�����

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;
}

29.9.2. sqlca

�����Ҫ��ǿ��Ĵ�������ƣ���ôǶ��� SQL �ӿ��ṩ��һ���� sqlca ��ȫ�ֱ���������һ���������涨��Ľṹ��

struct
{
    char sqlcaid[8];
    long sqlabc;
    long sqlcode;
    struct
    {
        int sqlerrml;
        char sqlerrmc[70];
    } sqlerrm;
    char sqlerrp[8];
    long sqlerrd[6];
    char sqlwarn[8];
    char sqlstate[5];
} sqlca;

����һ�����̵߳ij����ÿ���߳��Զ�����Լ��� sqlca �Ŀ����������ʽ�����ڴ����׼ C ȫ�ֱ��� errno����

sqlca ��������ʹ��������һ������ִ���г��ֶ��������ߴ�����ô sqlca ��ֻ�������һ������Ϣ��

��������� SQL ���ִ�й�����û�з������� ��ô sqlca.sqlcode ���� 0 ���� sqlca.sqlstate ����"00000"���������һ��������ߴ��� ��ô sqlca.sqlcode ���Ǹ������� sqlca.sqlstate ������ "00000"��һ�������� sqlca.sqlcode ��ʶһ���޺����������������IJ�ѯ�������С�sqlcode �� sqlstate ��������ͬ�Ĵ���ģʽ��������ϸ���ܡ�

������һ�� SQL ���ɹ�������ʺϸþ��������ô sqlca.sqlerrd[1] ������������е� OID���� sqlca.sqlerrd[2] ���� ����򷵻ص�������

�ڷ���������߾��������£�sqlca.sqlerrm.sqlerrmc ������һ�������ô�����ִ����ֶ� sqlca.sqlerrm.sqlerrml �����洢�� sqlca.sqlerrm.sqlerrmc ��Ĵ�����Ϣ�ij��ȣ�strlen() �Ľ���� �� C ����Ա��˵�����������ĵģ�����ע����Щ��Ϣ̫����������ܴ洢�ڶ����� sqlerrmc ��������ǻᱻ�ضϡ�

�ڷ������������£�sqlca.sqlwarn[2] ������Ϊ W�� ������������������£�����������Ϊ�� W ��ͬ�Ķ����������sqlca.sqlwarn[1] ����Ϊ W����ô����һ����ֵ�ڴ洢������������ʱ�򱻽ضϡ� ����κ�����Ԫ�����óɱ�ʾһ�����棬��ô sqlca.sqlwarn[0] ������Ϊ W��

�ֶ� sqlcaid��sqlcabc�� sqlerrp ��ʣ�µ� sqlerrd �Լ� sqlwarn Ԫ��Ŀǰû�а������õ���Ϣ��

�ṹ sqlca û���� SQL ��׼�ﶨ�壬�����ںü������� SQL ���ݿ�ϵͳ�ﶨ���ˡ� ����ĺ��Ķ����ƣ������������д������ֲ��Ӧ�ã���ô��Ӧ����ϸ�о���ͬ��ʵ�֡�

29.9.3. SQLSTATE �� SQLCODE ֮�Ƚ�

�ֶ� sqlca.sqlstate �� sqlca.sqlcode ���ṩ�����������ֲ�ͬ��ģʽ�����ֶ��� SQL �������ˣ����� SQLCODE �� 1992 ��ı�׼�汾���עΪ�����ģ������� 1999 ��汾�ﱻɾ���ˡ���ˣ�������Ӧ�ã�����ǿ�ҽ���ʹ�� SQLSTATE��

SQLSTATE ��һ�����ַ������顣����ַ�������ֵ���ߴ�д��ĸ�� ������ִ�����߾��������Ĵ��롣SQLSTATE �и���λ���ģʽ��ͷ�����ַ���ʶ������ͨ����ʾ������������� �������ַ���ʾ�ڸ�ͨ�����е����ࡣ�ɹ���״̬���� 00000 ��ʶ�ġ�SQLSTATE �����ڴ�����ط����Ƕ����� SQL ��׼��ġ�PostgreSQL ����������֧�� SQLSTATE ������룻�����Ӧ����ʹ������������ģʽ����ʵ�ַdz��ߵ�һ���ԡ�������Ϣ����� Appendix A��

SQLCODE �Ƿ����Ĵ������ģʽ����һ���򵥵������� 0 ��ʶ�ɹ���������ʶ���Ŷ�����Ϣ�ijɹ���������ʾһ������SQL ��׼ֻ����������ֵ +100�� �����ʾ������������л���Ӱ�������У�����û���ض��ĸ���ֵ�� ��ˣ����ģʽֻ��ʵ�ֺ����޵�һ���Բ��Ҳ�û��һ����λ��Ĵ�����ơ� ��ʷ�ϣ�PostgreSQL ��Ƕ��� SQL ������Ϊ�Լ�ʹ�ø�����һЩ SQLCODE ����ֵ����Щ���������г����������ǵ���ֵ�ͷ���������ס��Щ�Dz�����ֲ������ SQL ʵ����ȥ�ġ� Ϊ�˼�Ӧ���� SQLSTATE ģʽ����ֲ�����ǻ��г��� SQLSTATE�� ������������ģʽ֮��û��һ��һ����һ�Զ��ӳ�䣨������Զࣩ���������κ�������㶼Ӧ�òο��� Appendix A ���г���ȫ��SQLSTATE��

��Щ���Ѿ���ֵ�� SQLCODE ��ֵ��

-12 (ECPG_OUT_OF_MEMORY)

������������ڴ��Ѿ��ľ���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_CONVERT_BOOL)

����ζ����������������Ϊ bool �Ķ����ݿ��е����ݼȲ���'t' Ҳ���� 'f'����SQLSTATE 42804��

-208 (ECPG_EMPTY)

���͸� PostgreSQL ������������ǿյġ� �����ͨ��������Ƕ�� SQL ��������֣������������һ���ڲ����󡣣� ��SQLSTATE YE002��

-209 (ECPG_MISSING_INDICATOR)

������һ����ֵ������û���ṩ��ֵָʾ����������SQLSTATE 22002��

-210 (ECPG_NO_ARRAY)

��һ����Ҫ����ĵط�ʹ����һ����ͨ��������SQLSTATE 42804��

-211 (ECPG_DATA_NOT_ARRAY)

��һ����Ҫ����ĵط����ݿⷵ����һ����ͨ������ ��SQLSTATE 42804��

-220 (ECPG_NO_CONN)

������ͼ����һ�������ڵ����ӡ���SQLSTATE 08003��

-221 (ECPG_NOT_CONN)

������ͼ����һ�����ڵ�δ�򿪵����ӣ�����һ���ڲ����󡣣���SQLSTATE YE002��

-230 (ECPG_INVALID_STMT)

�����ڳ���ʹ�õ���仹û׼���á���SQLSTATE 26000��

-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��

-400 (ECPG_PGSQL)

һЩ PostgreSQL ���������µĴ��� ��Ϣ�������� PostgreSQL �������Ĵ�����Ϣ��

-401 (ECPG_TRANS)

PostgreSQL �������Dz����������ύ�� ���߻ع�������񡣣�SQLSTATE 08007��

-402 (ECPG_CONNECT)

�����ݿ��������ͼû�гɹ���SQLSTATE 08001����

100 (ECPG_NOT_FOUND)

���Ǹ��޺�����������ʾ���һ������������ߴ��������У����������α�Ľ�β����SQLSTATE 02000��