第二章 编写ESQL 联系客服

发布时间 : 星期日 文章第二章 编写ESQL更新完毕开始阅读551b4b26a5e9856a56126020

第二章 编写ESQL/C程序

第二章 编写ESQL/C程序

INFORMIX ESQL/C编程要求开发人员能够熟练使用C语言编程,这样就能够充分利用C语言的强大功能开发出满足各种需求的应用程序。

2.1 嵌入SQL语句

ESQL/C程序是把SQL语句嵌入到C程序中。可以嵌入到C程序中的SQL语句除了交互式的SQL语句之外,还有一些是专用于编程用的。交互式的SQL语句是指数据库操作语句和定义语句,它们能在数据库SQL语句界面中使用。而INFORMIX ESQL/C程序出现的PREPARE语句则属于非交互SQL的SQL语句。对于所有用于ESQL/C程序的SQL语句,需要用特殊的符号把它们标识出来。INFORMIX ESQL/C嵌入SQL语句的方法有两种:

(1)SQL语句用“$”符号作引导符,用“;”作为SQL语句的结束符。这种方式是INFORMIX ESQL/C的独特用法,其它的数据库厂商不一定支持。

(2)SQL语句用“EXEC SQL”为前导,“;”表示SQL语句的结束。这种方式是ANSI制 定的标准方式,所有的数据库厂商都支持。考虑到程序的可移植性,采用这种嵌入 方式比较好。

在ESQL/C程序中,SQL语句与其它C语句具有同等的地位,也就是说,SQL语句能出现在C语句能出现的任何地方。

2.2 前导文件、蕴含文件

2.2.1 前导文件

ESQL/C提供了以下四个前导文件以定义存放所需信息的数据结构:

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

sqlda.h: 包含含有动态定义变量的值指针和描述信息的结构 sqlstype.h:包含SQL语句中用到的常整数

sqltypes.h:包含与C语言和SQL中的数据类型相当的串定义

在ESQL/C程序中根据特定的需要包含不同的前导文件。为了检查ESQL/C语句执行成功与否,程序中总要包含sqlca.h,其它三个前导文件则根据需要而定。

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

$include文件名; /* 文件名不带后缀 */

5

第二章 编写ESQL/C程序

2.2.2 蕴含文件

在ESQL/C程序中,若要包含除前导文件之外的其它ESQL/C文件,语法为: $include文件名;

或EXEC SQL INCLUDE文件名;

由此可见,前导文件,蕴含文件与标准C程序头文件不同的地方有两点,一是语法形式不同,前导文件,蕴含文件在include前加上符号“$”或EXEC SQL;二是引起的处理不同,ESQL/C预处理程序将C程序的头文件直接传给C编译器,而对前导文件,蕴含文件,则要先将其处理成C程序的文件,然后再传给C编译器。

2.3 C语句与SQL语句的数据传递

2.3.1 数据类型对照关系

两种语句之间通过变量来进行数据传递,这类变量称为宿主变量。出现在SQL语句中的宿主变量必须与SQL的数据类型相对应,才能保证操作的正确性,而宿主变量是说明成C语言的数据类型的,为此ESQL/C提供了两种数据类型之间的对应关系,如下表所示。

SQL C Language CHAR(n) char[n+1] CHARACTER(n) SMALLINT short int INTEGER long int INT DECIMAL dec_t or struct decimal DEC NUMERIC SMALLFLOAT float REAL FLOAT Double DOUBLE PRECISION MONEY dec_t or struct decimalz SERIAL long int DATE Long int DATETIME Dtime_t or struct dtime INTERVAL Intrvl_t or struct intrvl

当数据由数据库传入ESQL/C程序时,宿主变量的类型应与SQL数据类型相容,反之亦然。

如果没有说明一个类型相容的宿主变量,有时系统会自动转换数据类型。当类型无法互换时,系统会报错:如果接收域太小,就会发生丢失数据的情况:当丢失的是有效数字时系统报错,当丢失的是有效字符时系统发出警告。

6

第二章 编写ESQL/C程序

INFORMIX ESQL/C程序中的数据类型分为简单数据类型和复杂数据类型,它们的含义和使用方法在这章中介绍。对于每种数据类型,在ESQL/C程序中都有与之对应的类型,类型对应是基于各类型所占用的存储空间。另外,INFORMIX ESQL/C提供若干数据操作、类型转换的库函数,可以很方便的被开发人员调用。

●简单数据类型

简单数据类型包括:CHAR、SMALLINT、INTEGER、SMALLFLOAT、FLOAT、SERIAL和DATE类型。

对于SQL字符类型CHAR(n),为了字符不被截断,定义宿主变量的字符串长度一定是n+1,因为C语言中的字符串类型的数据在存储时有一个字节放空结束符(“\\0”)。INFORMIX ESQL/C提供了许多处理字符串类型的库函数,如rstod()、rstoi()等等。

对于数值类型的数据,在算术表达式中都当作DECIMAL数据类型对待。DECIMAL数据类型的格式是这样的:DECIMAL (m[,n])其中m表示数据的有效数位,n表示小数点后面的数位。当省略n时,表示小数点的位置不固定。

各数值类型与DECIMAL类型的对应关系为: FLOAT → DECIMAL(16) SMALLFLOAT → DECIMAL(8) INTEGER → DECIMAL(10,0) SMALLINT → DECIMAL(5,0)

DATE类型对应C的long类型。这是因为在数据库, DATE类型的数据存储是这样来规定的:1899年12月31日0,1900年1月1日为1,依此类推。DATE类型与字符串类型可相互转换,参见INFORMIX ESQL/C的库函数。

●复杂数据类型

对每种复杂的数据类型,在这里只介绍它的用法。

(1)DECIMAL数据类型

-128

DECIMAL数据类型是可表示一切数值型的数据,所表示的数据范围为:10×10-10×+126

10;在ESQL/C程序中,DECIMAL值存放在decimal.h的dec_t结构中,需要包含文件decimal.h。

(2)DATETIME和INTERVAL数据类型

DATETIME数据类型用来表示时间,INTERVAL数据类型用来表示时间间隔。在ESQL/C程序中,DATETIME数据存放在dtime_t结构中,INTERVAL数据存放在intrvl_t结构中,这需要包含datetime.h文件。

在程序中,定义DATETIME的数据变量用下面的语句形式:

dtime_t 最大修饰粒度 to 最小修饰粒度 变量名

7

第二章 编写ESQL/C程序

其中最大修饰粒度和最小修饰粒度从以下几个关键字中选取: YEAR MONTH DAY HOUR MINITE SECOND FACTION (n)

例如:$dtime_t year to minute dtvar;这条语句定义了变量dtvar的表示形式是从年到秒。

在程序中,定义INTERVAL的数据变量用下面的语句形式: intrvl_t 最大修饰粒度 to 最小修饰粒度 变量名

其中最大修饰粒度和最小修饰粒度必须同时从以下两个类之一的关键字中选取: year-month类 Day-Time类 YEAR DAY

MONTH HOUR MINUTE SECOND FRACTION

例如:$intrvl_t day to minute itvar;这条语句定义了变量itvar的表示形式是从天到秒。

(3)VARCHAR数据类型

VARCHAR数据类型用来定义变长字符串变量。VARCHAR类型定义的形式一般为: VARCHAR str(n,m),n表示str的最大长度,m表示str的最小长度。

在ESQL/C程序中可以使用char (n+1), string(n+1), varchar(n+1), fixchar(n)等数据类型来存放VARCHAR类型的数据。

2.3.2 宿主变量的定义

宿主变量是用于SQL语句的普通C变量,ESQL/C程序通过宿主变量在C语句和SQL语句之间进行数据传递,如用SQL中的Select语句,将数据从数据库中查找出来,放到宿主变量中,C语句就能对该数据进行处理。

ESQL/C可在使用常数的任何地方使用宿主变量和指示变量。如果在SQL语句中使用了宿主变量,必须在它前面加上美元符($)或冒号(:),如宿主变量hostvar以$hostvar或:hostvar的形式出现在SQL语句中,其中:hostvar形式是符合ANSI标准的。

宿主变量被说明成通常的C变量,然后再加上如下的任一种标识:

(1)在说明语句前放入美元符“$” (2)将说明语句放在以下两条语句之间 EXEC SQL BEGIN DECLARE SECTION; EXEC SQL END DECLARE SECTION;

例子:

/* 指向字符串的指针 */ $ char * hostvar; /* 整数 */

8