ProC

2026/1/12 20:23:24

假如存在绑定变量占位符,那么应用程式必须为其赋值并分配内存。 11)打开游标

12)使用DESCRIBE命令获取查询列表信息

假如动态SQL语句是SELECT语句,我们还必须使用DESCRIBE SELECT LIST命令将查询列表项的信息存储到查询描述区中。另外需要注意两点:

·该命令将F配置为实际的查询列表数,假如SQL语句不是SELECT语句,则变量F被配置为0。 ·NUMBER值长度不可用,必须使用函数sqlprc()获取精度和标度。 13)重新配置查询列表项

这一步用于将DESCRIBE命令获取到的实际查询列表项个数配置为查询列表项的最大个数。 14)重新配置每个查询列表项的长度和数据类型

在使用FETCH命令获取查询列表项数据前,为显示结果可能需要重新配置某些元素的长度和数据类型。

15)利用FETCH命令检索数据

执行此命令后,数据被存储到了查询描述区中。 16)获取并处理查询列表值

在执行了FETCH命令后,能够通过数组V和数组I中的元素来处理检索到的数据。 17)关闭游标

在推进游标、检索完数据后,执行如下命令关闭游标: EXEC SQLCLOSE s_cursor;

18)释放空间使用函数free()释放由函数malloc()所分配的内存,使用函数sqlclu()释放为查询描述区连同绑定描述区所分配的空间 [目录]

-------------------------------------------------------------------------------- 检测错误和状态改变

在Pro*C/C++中,用于检测错误和状态改变的方法有如下两种:

·定义状态变量SQLSTATE或SQLCODE,在执行了SQL语句后检查他们的值,并根据需要执行相应的操作。

·使用SQLCA。SQLCA被定义在头文档sqlca.h中。

在该程式中我们使用了SQLCA进行错误检测。关于SQLCA的周详描述请参阅第八章相关说明,这里不再累述。

WHENEVER语句用于检测并处理错误,使用该语句的语法如下: EXEC SQL WHENEVER

1)条件(condition) Oracle可自动检测以下条件:

·SQLWORING:当Oracle返回警告信息时会配置sqlworn[0]为“W”。使用该条件必须定义SQLCA。 ·SQLERROR:出现严重错误,此时SQLCODE为负值。

·NOT FOUND:当Oracle不能找到满足条件的记录时SQLCODE被置为+1403。 2)操作(action)

当Oracle检测到以上条件时,应用程式能够执行如下操作: ·CONTINUE:继续运行下一条语句。 ·DO:执行错误处理函数。

·GOTO lable_name:转移到标号处执行。STOP:停止执行,回滚事务。 [目录]

-------------------------------------------------------------------------------- SQLCA

SQLCA是个数据结构,他的成员包含了SQL语句执行后的错误、警告和状态信息。在ORACLE_HOMEpro80cinclude目录下的sqlca.h文档中定义了SQLCA结构。 使用如下语句能够将SQLCA包含到应用程式中: EXEC SQL INCLUDE SQLCA; 或 #include 其部分结构成员如下:

·sqlcaid:标识SQL通讯区的字符串成员,他被初始化为“SQLCA”。 ·sqlcabc:整数成员,用于保存SQLCA的字节长度。

·sqlcode:整数成员,他保存着SQL语句执行后的状态代码。Sqlcode的值和含义见表8-1: Sqlcode的值 含义

0 执行SQL语句成功

>0 执行了该语句但检测到异常情况 <0 出现严重错误,语句没有执行

·sqlwarn:用于配置警告标记的单字符数组,通过赋“W”来配置警告标记。

·sqlerrm:包含了成员sqlerrml及sqlerrmc的一个结构,其中sqlerrml用于保存错误文本长度,sqlerrmc用于保存错误文本。

Sqlerrmc最多能够保存70个字符的错误消息,使用函数sqlglm能够获得完整的错误消息文本,该函数的语法如下:

voidsqlglm(char *message_buffer,size_t *buffer_size,size_t *message_lenth); 参数说明如下:

·message_buffer:存储错误消息的文本缓冲区(尾部以空格填充)。 ·buffer_size:缓冲区的字节长度。 ·message_lenth:错误消息的实际长度。

注意,调用该函数前必须确保SQLCODE或sqlca.sqlcode不等于0。该函数只能用于非线程应用。 SQLCA中还包括其他结构成员,包括sqlerrp、sqlerrd、sqlext等,由于这些成员的作用相对次要或在程式中没有使用,故这里暂不作介绍。 [目录]

-------------------------------------------------------------------------------- SQLDA

SQLDA结构的作用是处理和保存查询列表项连同宿主变量占位符的信息。

当SQL语句所包含的查询列表项或绑定变量的个数不能确定时,我们就需要使用SQLDA结构来定义和描述查询列表项或绑定变量占位符。因此,该结构也被称为描述区,绑定变量列表所对应的绑定变量列表所对应的描述区就称为绑定描述区。

SQLDA结构保存在ORACLE_HOMEpro80include目录下的sqida.h文档中。利用如下语句能够将该结构包含至应用程式中: EXEC SQL INCLUDE sqlda;

尔后还要定义指向查询描述区和绑定描述区的指针: SQLDA *bind_dp; SQLDA *selectdp; 该结构的内容如下: struct SQLDA { long N; char **V; long *L; short *T; short **I; long F;

char **S; short *M; short *C; char **X; short *Y; short *Z; };

该结构的成员函数在动态SQL方法四中发挥着重要的作用,故在这里进行较详尽的介绍: ·变量N:

变量N用于指定查询列表项或占位符的最大个数。在执行DESCRIBE命令前,必须将变量N配置为查询列表项或占位符的最大个数;在执行了DESCRIBE命令后,还必须将变量N配置为存储在变量F中的实际变量数。 ·变量V:

变量V是指向数据缓冲区地址数组的指针,该数据缓冲区用于存储查询列表项或绑定变量的值。当分配描述区时,函数sqlald()会将V[0]到V[N-1]配置为0。该函数语法如下: descriptor_name=sqlald(max_vars,max_name,max_ind_name); 参数说明如下:

·max_vars:查询列表项或占位符的最大个数。

·max_name:查询列表项名称或占位符名称的最大长度。 ·max_ind_name:占位符指示变量名称的最大长度。

函数sqlald()只用于非线程应用。而假如要在线程应用中完成同样的功能,则需要使用函数sqlaldt()。另外,也能够使用SQLLIB的新函数SQLSQLDAAlloc(),该函数既可用于线程应用,又可用于非线程应用。 对于查询描述区来说,在执行FETCH命令前必须为变量V分配内存。语句EXEC SQL

FETCH…USINGDESCRIPTOR…将查询列表数据存储到了由V[0]到V[N-1]所指向的数据缓冲区中。其中,第i个值存储在V[i-1]所指向的数据缓冲区中。

对于绑定描述区来说,在执行OPEN命令前必须为变量V分配内存。语句EXEC SQL

OPEN…USINGDESCRIPTOR…将使用由V[0]到V[N-1]所指向的绑定变量值来执行动态SQL语句。其中,第i个绑定变量的值存储在V[i-1]所指向的数据缓冲区中。 ·变量L:

变量L是指向存储在数据缓冲区中的查询列表值或绑定变量值的长度数组的指针。

对于查询描述区来说,DESCRIBESELECT LIST命令会将长度数组配置为每个查询列表项的最大长度。各种数据类型的长度是各不相同的。对于CHAR或VARCHAR2类型的查询列表项来说,DESCRIBE SELECT LIST将L[i]配置为查询列表项的最大长度;而对于NUMBER类型的查询列表项来说,分别被保存到了,通过调用函数sqlpre()能够从L[i]中读取到精度和标度值。函数sqlpre()的语法如下:


ProC.doc 将本文的Word文档下载到电脑
搜索更多关于: ProC 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219