
# sqlca
嵌入式SQL接口提供了sqlca（SQL通信区）的全局变量。sqlca包含告警和错误信息。如果在语句执行期间发生多个告警和错误，那么sqlca只保存最后一个信息。在一个多线程的程序中，每一个线程会自动得到它的sqlca副本。
数据结构如下：
```
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;
```
如果SQL语句没有发生错误，则sqlca.sqlcode为0，sqlca.sqlstate为"00000"。如果发生了告警或者错误，那么sqlca.sqlcode为负数并且sqlca.sqlstate不同于"00000"。SQLSTATE与SQLCODE的具体值请参见[SQLSTATE与SQLCODE](https://support.huaweicloud.com/distributed-devg-v10-gaussdb/gaussdb-12-0340.html)章节。
当SQL语句成功执行时，sqlca.sqlerrd\[1\]将存储被处理行的OID，而sqlca.sqlerrd\[2\]则记录被处理或返回的行数。若执行过程中出现错误或警告，sqlca.sqlerrm.sqlerrmc将包含描述该错误的字符串，同时sqlca.sqlerrm.sqlerrml表示该错误消息的长度（即strlen()的结果）。需要注意的是，由于sqlerrmc数组长度固定，部分较长的错误消息可能会被截断。
在发生告警时，sqlca.sqlwarn\[2\]被设置为W。
sqlcaid、sqlabc、sqlerrp、sqlwarn以及sqlerrd的剩余元素目前未包含有用的信息。
示例如下：
```
/* 整合WHENEVER和sqlca实现错误处理 */
EXEC SQL WHENEVER SQLERROR SQLCALL 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 
===============
```
