Chinaunix首页 | 论坛 | 博客
  • 博客访问: 90993520
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: DB2/Informix

2008-04-07 08:00:17

  出处:Unix爱好者家园unix-cd.com   


1、概述

使用INFORMIX-ESQL/C语句的C程序一般包括下列元素:

·           前导文件

·           include文件

·           宿主变量

·           指示变量

·           INFORMIX-ESQL/C语句

·           错误处理

2、前导文件

包含INFORMIX-ESQL/C语句的C程序包括以下前导文件:

       sqlca.h                 包含存放出错信息的结构。

       sqlda.h                 包括含有值指针和动态变量描述的结构。

       sqlstmtype.h    包含RDSQL语句中用到的常整数。

       sqltype.h              包含C语言和RDSQL数据类型中串定义。

包括这些文件的语法如下:

$include        sqlca;

$include       sqlda;

$include       sqlstmtype;

$include       sqltypes;

如果你的程序不用到包含于上述文件中的结构或定义,程序就不必包括sqlda.h,sqlstmtype.h或sqltype.h。但总要含有sqlca.h以检查INFORMIX-ESQL/C 是执行成功还是失败。

3、蕴涵文件

你可以使用$include预处理程序语句去包括你程序中除了前导文件之外的其它INFORMIX-ESQL/C 文件。使用的语法如下:

$include       文件名

INFORMIX-ESQL/C 预处理程序在include语句的地方读该文件到当前文件中,然后处理它并把它传给C编译程序。在INFORMIX-ESQL/C 预处理后,C的标准#include包含了该文件,如果文件中含有RDSQL语句则你必须使用include。

4、宿主变量

宿主变量是你用于RDSQL语句的普通C变量。如果你在RDSQL语句中使用了宿主变量。就在其名前加前缀美圆符($)。例如,宿主变量hostvar以$hostvar形式出现于RDSQL语句中。为了与其它SQL扩充版兼容的需要,你也可以使用冒号(:)代替美圆符号。

除了变量说明必须以美圆符号($)为前导之外,宿主变量均被说明为原始的C变量:

/* pointer to a character */

$ char *hostvar;

/* integer */

$ int hostint;

因为宿主变量出现在RDSQL语句中,所以它们同RDSQL数据类型有关。此外,宿主变量也必须按C数据类型说明。

RDSQL                                     C Language

CHAR(n)                                   char array[n+1]

SMALLINT                                   short int

INTEGER                                   long int

SERIAL                                      long int

SMALLFLOAT                            float

FLOAT                                       double

DATE                                         long int

MONEY                                      struct decimal or dec_t

DECIMAL                                   struct decimal or dec_t

你可以根据需要定义多个宿主变量(其上限为C编辑程序符号表的长度)。在单条RDSQL语句中,你使用的宿主变量个数不能多于50。

5、指示变量

因为在其它值中NULL值经常是不明确的,所以你必须能够发现INFORMIX-ESQL/C语句是否将NULL值返回给宿主变量。如果一个宿主变量对应于允许NULL值的数据库字段,则你必须定义与宿主变量相对应的指示变量。对应的宿主变量称为主变量。若一条INFORMIX-ESQL/C语句将NULL值返回给宿主变量(通过SELECT或FETCH语句的INTO子句)而且你已定义了指示变量,则指示变量具有负值。宿主变量的实际值可能不是有意义的C值。如果你未给宿主变量指定变量且INFORMIX-ESQL/C返回NULL值,则出错且RDSQL将sqlca.sqlcode置成负值。

若非NULL的RDSQL值取出给宿主变量字符数组,则它可能要截短以适合数组长度。在这种情况下,INFORMIX-ESQL/C设置相应的指示变量为截短前的RDSQL变量的字节数长度。截短的事实在sqlca结构中有信号标志;而指示变量告诉你截短的程度。如果返回值既非NULL也不截短,则指示变量具有零值。

指示变量必须说明成短整数。当你在RDSQL语句中引用指示变量时,你必须在指示变量名前及紧跟在主变量后加前缀冒号(:)。如果hostvarind是主变量hostvar的指示变量,则在RDSQL语句中你把这一对变量表示成$hostvar:hostvarind。

例:

$      char name[16];

$      char comp[20];

$      short nameind;

$      short compind;

………….

$      select lname,company

               into $name:nameind, $comp:compind

               from customer

              where customer-num=105;

如果lname在表customer中定义其长度大于15个字符的话,nameind就包含字段lname的实际长度。Name包含前15字符(串name必须以空字符结束)。如果用顾客编号=1005表示的公司的姓氏少于15个字符,则可截去尾空格。

同是这一顾客若其字段company具有NULL值的话,compind就具有负值。字符数组comp的内容不能被预言。

作为INSERT语句可选用关键字NULL,你可使用带负值的宿主变量。

6、C例行程序中嵌入RDSQL语句

RDSQL语句按下述语法嵌入C例行程序中:

$       RDSQL语句;

INFORMIX-ESQL/C 可在使用常数的任何地方包含宿主变量(而且通常也同样可以包含指示变量)。

7、出错处理和sqlca结构

正常的数据库管理要求所有修改数据库的语句逻辑序列连续成功的完成。例如,如果你更新顾客帐目以示付帐节余少了$100,而由于某种原因,下一步对现金结余更新失败了,则你的帐本将不平衡。检查每一条RDSQL语句是否按你预计那样执行非常重要。

在执行了每一条除DECLARE以外的RDSQL语句后,INFORMIX-ESQL/C 返回结果码到结构sqlca中去。该结构在sqlca.h中定义,如下所示。

Struct sqlca_s{

               long sqlcode;

               char sqlerrm[72];

char sqlerrp[8];

long sqlerrd[6];

struct sqlcaw_s{

char sqlwarn0; 

char sqlwarn1;

char sqlwarn2;

char sqlwarn3;

char sqlwarn4;

char sqlwarn5;

char sqlwarn6;

char sqlwarn7;

}sqlwarn;

}sqlca;

解释

sqlcode

       表示执行INFORMIX-ESQL/C 语句的结果。

对于大多数语句的成功执行它被置零,对于返回零记录的成功检索或在工作集结尾以外的查找操作FETCH被置成SQLNOTFOUND(在sqlca.h中定义成100)。

sqlcode对不成功的执行值为负。

sqlerrm         现在不用。

Sqlerrp          现在不用。

Sqlerrd          有六个长整数的数组。

sqlerrd[0]       现在不用。

sqlerrd[1]       是返回的SERIAL型值或是ISAM错误码。

sqlerrd[2]       是处理的记录数目。

sqlerrd[3]       现在不用。

sqlerrd[4]       RDSQL语句中的错误补偿。

sqlerrd[5]       最后一条记录的ROWID。

Sqlwarn  是包含标志在RDSQL语句执行之后的各种警告条件(与错误相对)的八个字符的结构。如果不发现问题,这些字符为空。

Sqlwarn  如果一个或多个其它警告字符已被置成W,则它被设置成W。如果

sqlwarn0为空,你就不必去检查剩下的警告字符了。

sqlwarn1       如果一个或多个数据项被截短以适应字符宿主变量,则其被置成W。

通过检查对应的标识符变量你可以发现哪一项被截断。

sqlwarn2       如果聚合函数(SUM,AVG,MAX,MIN)在求值中碰到NULL值则其被置

成W。

sqlwarn3       若SELECT子句的选择列表中的项目数不同于INTO子句中的宿主

变量数,则其被置成W。由RDSQL返回的项数不会超过宿主变量数。

sqlwarn4       若UPDATE或DELETE语句不用WHERE子句准备,则其被DELETE

                     语句置成W。UPDATE或DELETE可以不带WHERE子句作用于整

个表。通过检查此变量,你可以避免对表的无意的全局修改。

sqlwarn5       现在不用。

sqlwarn6       现在不用。

sqlwarn7       现在不用。

       当sqlca.sqlcode为负时,通过采取正确的操作你能从对数据库进行所需修改的失败中复原。通过检查sqlca.sqlcode=SQLNOTFOUND,你可以仅在记录返回时书写处理检索结果的代码程序。

8、编译ESQL/C 例行程序

你用INFORMIX-ESQL/C 语句编写的代码程序在你使用C编译程序之前必须预处理。INFORMIX-ESQL/C 预处理程序把嵌入的语句转换成C语言代码程序。然后这个结果文件用C编译程序编译而产生目标文件,该文件反过来必须与INFORMIX-ESQL/C 一同安装的esql命令文件去执行所有这些任务。

为在UNIX系统中对含有INFORMIX-ESQL/C 语句的C程序进行预处理和编译,请给出其以.ec为扩展名的文件并打入以下命令以响应系统提示:

esql [-e] [-otherargs…] [-o outfile] \

       sqlfile.ex [othersrc.c…] \

       [otherobj.o…] [-lyourlib…] (14)

其中sqlfile.ec是你的C程序而outfile是可执行的输出文件的名字。Esql先处理s       qlfile.ec中的内嵌的RDSQL语句,如果成功,便生成文件sqlfile.c。如果环境变量INFORMIXDIR已被正确设置,则esql把所有其它变量(-otherargs)、sqlfile.c和其它C源程序文件(othersrc.c)直接传给C编译程序cc以生成sqlfile.o和othersrc.o。然后将这些文件与命令行中存在的其它C目标程序(otherobj.o),与相应的INFORMIX-ESQL/C 库例行程序联接起来。

-e选项允许你请求无编译或联接的预处理步骤。
阅读(1811) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~