70、SQL通信区(SQLCA)
来源:互联网 发布:淘宝网妈妈装针织马甲 编辑:程序博客网 时间:2024/05/21 06:52
SQLCA的说明
执行PRO*C程序时, ORACLE把每个SQL语句执行的状态信息存入到 SQLCA中, 这些信息包扩错误代码、警告标志、诊断正文和处理行数。因此返回的信息来检测SQL语句的执行情况。
SQLCA的组成
PRO*C程序中的SQLCA时C语言中的一个结构变量, 组成为:
struct sqlca {
char sqlcaid[8];
long sqlcabc;
long sqlcode;
struct {
unsigned short sqlerrml;
char sqlerrmc[70];
} sqlerrm;
char sqlerrp[8];
long sqlerrd[6];
char sqlwarn[8];
char sqlext[8];
};
struct sqlca sqlca;
sqlcaid: 字符串字段, 被初始为sqlca, 用于标识SQL通信区。
sqlabc: 整型字段, 用于保留SQL通信区的字节长度。
sqlcode: 整型字段, 用于保留最近执行的SQL语句的状态:
= 0 表示该SQL语句执行成功, 没有发生错误和异常。
> 0 表示执行了该SQL语句, 但有一异常。
< 0 表示由于DB、系统、网络或程序有错误, ORACLE 未执行该语句。如出现这类错误, 当前事务一般回退。
sqlerrm: 是个子结构, 含有两个元素。
sqlerrmc: 字符串字段, 保存与sqlcode对应的正文, 用SQLGLM()函数引用。当sqlcode < 0时, 该正文表示当前SQL的执行情况; 如sqlcode = 0时, 该正文表示前面SQL的执行情况。
sqlerrml: 整字段, 上述正文长度。
sqlerrd: 长整数组, 6个元素, 用了2个。
sqlerrd[2]: 保存当前SQL语句处理的行数。但若当前SQL失败, 则无定义; 若在数组操作中出错, 则停于出错行, 这时给出成功处理的行数; OPEN执行后, 清为0, FECTH 后增值; EXECUTE、INSERT、UPDATE、SELETE和SELECT后, 为成功处理的行数。
sqlerrd[4]: 指出语句中出错的位移, 首字符位移为0。
sqlwarn: 字符数组, 8个元素, 用了5个。
sqlwarn[0]: 如为空, 无警告; 如为"W", 有警告;
sqlwarn[1]: 如为 "W", 表示宿主变量宽度不够, 返回字符数据被截断; 对数字型数据截断无警告。为了决定何字段被截断及截了多少, 查相应指示变量, 该指示变量的正值是列的原长。
sqlwarn[3]: 如为"W", 表示查询选择表中的列数不等于SELECT或FECTH的INTO子句的宿主变量数, 返回为两者中少者。
sqlwarn[4]: 如为"W", 表示DELETE或UPDATE语句无WHERE限制条件, 提醒用户小心。
sqlwarn[5]: 如为"W", 表示EXEC SQL CREATE {PROCEDURE | FUNCTION | PACKAGE | PACKAGE BODY}语句由于PL/SQL编译而失败
SQLCA说明
MODE={ANSI13|ORACLE}, 要说明SQLCA; MODE={ANSI|ANSI14},SQLCA说明可选, 但必说明SQLCODE状态变量。说明方式可为:
EXEC SQL INCLUDE sqlca;
也可把上述sqlca代码直接编在程序中。
一个PRO*C程序可说明多个SQLCA, 比如一全程 SQLCA, 几个局部SQLCA, ORACLE仅对活动的SQLCA返回信息。当 PRO*C由几个文件组成时, 在一源文件中定义一全局SQLCA, 另一源文件中说明为extern存储类, 其说明为:
#define SQLCA_STORAGE_CLASS extern
可用SQL_INIT处始SQLCA; 如SQLCA说明为自变量, 可能不能用它初始SQLCA。
ORACLE错误信息最大为512字节, 用SQLGLM可取出:
main()
{ char msg_buf[100]; /* buffer for message text */
int buf_size = 100; /* size of buffer in bytes */
int msg_len; /* length of message text */
EXEC SQL WHENEVER SQLERROR GOTO sqlerror
...
sqlerror: /* get full text of error massage. */
sqlglm(msg_buf, &buf_size, &msg_len);
/* Null_terminate and print the text. */
msg_buf[msg_len] = '\0';
printf("\n%s\n", msg_buf);
...
}
执行PRO*C程序时, ORACLE把每个SQL语句执行的状态信息存入到 SQLCA中, 这些信息包扩错误代码、警告标志、诊断正文和处理行数。因此返回的信息来检测SQL语句的执行情况。
SQLCA的组成
PRO*C程序中的SQLCA时C语言中的一个结构变量, 组成为:
struct sqlca {
char sqlcaid[8];
long sqlcabc;
long sqlcode;
struct {
unsigned short sqlerrml;
char sqlerrmc[70];
} sqlerrm;
char sqlerrp[8];
long sqlerrd[6];
char sqlwarn[8];
char sqlext[8];
};
struct sqlca sqlca;
sqlcaid: 字符串字段, 被初始为sqlca, 用于标识SQL通信区。
sqlabc: 整型字段, 用于保留SQL通信区的字节长度。
sqlcode: 整型字段, 用于保留最近执行的SQL语句的状态:
= 0 表示该SQL语句执行成功, 没有发生错误和异常。
> 0 表示执行了该SQL语句, 但有一异常。
< 0 表示由于DB、系统、网络或程序有错误, ORACLE 未执行该语句。如出现这类错误, 当前事务一般回退。
sqlerrm: 是个子结构, 含有两个元素。
sqlerrmc: 字符串字段, 保存与sqlcode对应的正文, 用SQLGLM()函数引用。当sqlcode < 0时, 该正文表示当前SQL的执行情况; 如sqlcode = 0时, 该正文表示前面SQL的执行情况。
sqlerrml: 整字段, 上述正文长度。
sqlerrd: 长整数组, 6个元素, 用了2个。
sqlerrd[2]: 保存当前SQL语句处理的行数。但若当前SQL失败, 则无定义; 若在数组操作中出错, 则停于出错行, 这时给出成功处理的行数; OPEN执行后, 清为0, FECTH 后增值; EXECUTE、INSERT、UPDATE、SELETE和SELECT后, 为成功处理的行数。
sqlerrd[4]: 指出语句中出错的位移, 首字符位移为0。
sqlwarn: 字符数组, 8个元素, 用了5个。
sqlwarn[0]: 如为空, 无警告; 如为"W", 有警告;
sqlwarn[1]: 如为 "W", 表示宿主变量宽度不够, 返回字符数据被截断; 对数字型数据截断无警告。为了决定何字段被截断及截了多少, 查相应指示变量, 该指示变量的正值是列的原长。
sqlwarn[3]: 如为"W", 表示查询选择表中的列数不等于SELECT或FECTH的INTO子句的宿主变量数, 返回为两者中少者。
sqlwarn[4]: 如为"W", 表示DELETE或UPDATE语句无WHERE限制条件, 提醒用户小心。
sqlwarn[5]: 如为"W", 表示EXEC SQL CREATE {PROCEDURE | FUNCTION | PACKAGE | PACKAGE BODY}语句由于PL/SQL编译而失败
SQLCA说明
MODE={ANSI13|ORACLE}, 要说明SQLCA; MODE={ANSI|ANSI14},SQLCA说明可选, 但必说明SQLCODE状态变量。说明方式可为:
EXEC SQL INCLUDE sqlca;
也可把上述sqlca代码直接编在程序中。
一个PRO*C程序可说明多个SQLCA, 比如一全程 SQLCA, 几个局部SQLCA, ORACLE仅对活动的SQLCA返回信息。当 PRO*C由几个文件组成时, 在一源文件中定义一全局SQLCA, 另一源文件中说明为extern存储类, 其说明为:
#define SQLCA_STORAGE_CLASS extern
可用SQL_INIT处始SQLCA; 如SQLCA说明为自变量, 可能不能用它初始SQLCA。
ORACLE错误信息最大为512字节, 用SQLGLM可取出:
main()
{ char msg_buf[100]; /* buffer for message text */
int buf_size = 100; /* size of buffer in bytes */
int msg_len; /* length of message text */
EXEC SQL WHENEVER SQLERROR GOTO sqlerror
...
sqlerror: /* get full text of error massage. */
sqlglm(msg_buf, &buf_size, &msg_len);
/* Null_terminate and print the text. */
msg_buf[msg_len] = '\0';
printf("\n%s\n", msg_buf);
...
}
- 70、SQL通信区(SQLCA)
- SQL通信区(SQLCA)
- やさしくわかるPro*COBOL - SQL通信領域(SQLCA) -
- SQLCA
- SQL中sqlca.sqlcode返回值的含义
- SQL中sqlca.sqlcode返回值的含义
- SQL中sqlca.sqlcode返回值的含义
- 嵌套SQL语句访问DB2中SQLCA的调用技巧
- 什么是SQLCA
- sqlca.h
- SQLCA 内涵
- sqlca 与存储过程
- sqlca.SynTaxFromSql 使用注意事项
- proC--sqlca.sqlcode
- PB 关于SQLCA
- sqlca.sqlcode 1405 解决方法
- 浅析 SQLCA及SQLDA
- SQLCA系统记录架构
- 中断 中断信号 中断源
- MySQL数据库结构和数据导出或导入
- Oracle开发专题之:分析函数总结
- 实例1 - 大型电子商务网站架构
- CentOS server 5.6 64位 防火墙开启、关闭以及开放指定端口
- 70、SQL通信区(SQLCA)
- java 除法结果保留两位小数,小数保留前导零
- Oracle开发专题之:分析函数2(Rank, Dense_rank, row_number)
- 用Eclipse结合Nexus创建Maven项目
- iOS code collection
- Java中Split函数的用法技巧
- PHP缓存详谈
- Oracle应用专题之:分析函数3(Top/Bottom N、First/Last、NTile)
- javascript Date的使用