admin 管理员组

文章数量: 887032


2023年12月23日发(作者:windows错误代码740)

INFORMIX ESQL/C 程序开发

1

第1章 INFORMIX ESQL/C 程序开发

1.1 概述

INFORMIX ESQL/C是数据库应用程序开发工具之一,它以它独有的灵活性、易学易用性,在众多数据库应用程序开发产品中占有一席之地。

 INFORMIX ESQL/C的特点

INFORMIX ESQL/C就是在C语言程序中直接嵌入SQL语句,这样做的目的是使得使用C语言开发应用程序的开发者能方便的访问数据库,开发出满足各种要求的数据库应用程序。那么,它与其它INFORMIX开发工具比较有什么特点呢?

首先,INFORMIX ESQL/C程序的开发没有一个菜单式的开发界面。如INFROMIX-4GL程序的开发有一个包含屏幕格式、模块、程序各部分编辑、编译及运行的菜单界面。而INFROMIX

ESQL/C是通过编辑工具如vi等来进行编辑的。

其次,INFROMIX ESQL/C开发需要一个预处理器来进行程序的预编译。INFORMIX ESQL/C的编译命令是esql,它完成预编译、编译、链接、生成可执行文件的等工作。预处理器所做的工作是将ESQL/C的代码转换成C的代码,再调用C的编译器来处理C程序代码。

INFORMIX公司对ESQL/C程序的开发有强劲的支持。在ESQL/C中不仅可以使用INFORMIX提供的预编译命令,还可调用INFORMIX提供的库函数和头文件。

 设置开发的环境变量

要利用INFORMIX ESQL/C提供以上所述的支持,必须在.profile或.login文件中设置有关环境变量:

INFORMIXDIR = INFORMIX ESQL/C的安装目录

PATH = $INFORMIXDIR/bin:$PATH

SQLEXEC = $INFORMIX/lib/sqlrm /*当ESQL/C版本与SERVER版本不同时*/

设置好环境变量后,便可以开始INFORMIX ESQL/C编程了。

 ESQL/C程序的编译及运行

用vi或其它编辑器编辑ESQL/C程序,ESQL/C的源程序文件名必须以.ec为后缀。接下来要做的是编译ESQL/C程序。

esql是用于编译INFORMIX ESQL/C程序的命令,它将嵌入的SQL语句转换成C的代码,再调用C的编译器CC,将C代码文件转换成目标代码文件,最后链接上标准函数库和INFORMIX ESQL/C的函数库,生成可执行的文件。嵌入式的SQL语句往往被翻译成DBMS专有程序设计接口的运行时库的函数调用。

esql命令有许多的选项,详细内容请参考INFORMIX ESQL Manual book。这里,举一个例子说明esql的流程,如图1.1。

esql file.c -l lib.a –o

preprocessor

demo1.c

CC compiler ESQL/C函数库

demo1.o file.o

标准函数库

图1.1

图1.1的esql命令将文件和file.c编译成可执行的文件。file.c文件不用经过预编译,由CC直接编译成目标文件。各文件的编译过程选择是根据文件名的后缀来确定的,所以在存储编辑好的文件时要使用恰当的文件后缀。-l选项后的文件名是用户定义的函数库名。这里,链接的函数库有三个:lib.a、ESQL/C函数库和标准函数库。

编译ESQL/C程序后,在操作系统提示符下键入文件名来执行。如:

INFORMIX ESQL/C 程序开发

2

 演示数据库stores

在介绍INFORMIX ESQL/C开发方法之前,先介绍本章和下章要用到的演示数据库stores。stores数据库存储仓库管理客户定购厂家提供的货物的有关信息,包括以下六个表:

(1) customer

(2) orders

(3) items

(4) stock

(5) manufact

(6) state

其结构如图1所示: items

orders item_num

order_num order_num stock

customer order_date stock_num stock_num manufact

customer_num customer_num manu_code manu_code manu_code

fname ship_instruct quantity descriptimanu_name

on

lname backlog total_price unit_pric

e

company po_num unit

addresss1 ship_date unit_desc

r

addresss2 ship_weight

state city ship_charge

code state paid_date

sname zipcode

phone

INFORMIX ESQL/C编程要求开发人员已经熟练使用C语言编程。这样,就能够充分利用C语言的强大功能开发出满足各种需求的应用程序。所以本章拟定读者为有一定C语言编程经验的人,从而有关C 语言的内容都不介绍,请用户自己查阅C语言的有关文献。

1.2 如何编写ESQL/C的程序

1.2.1 嵌入SQL语句

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

(1) SQL语句用“$”符号作引导符,用“;”作为SQL语句的结束符。这种方式是INFORMIX

ESQL/C的独特用法,其它的数据库厂商不一定支持。

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

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

INFORMIX ESQL/C 程序开发

3

1.2.2 宿主变量的定义及使用

既然ESQL/C程序是用于数据库应用程序开发的工具,那么就需要把数据库中存储的数据传递到程序来做处理,同样,程序变量的值也要存储到数据库中。在程序数据和数据库数据起到桥梁作用的是宿主变量。

宿主变量是一般的C程序变量,它能出现在SQL语句中常量所在的位置。例如:

UPDATE stock set unit_price = 34.22

where customer_num = 101

对于这条SQL语句,34.22和101是常量,那么在ESQL/C中使用时可以替换成宿主变量。

 宿主变量的定义

在引用宿主变量之前必须先定义,定义宿主变量有两种方法:

(1) 用“$”

其一般形式为:

$数据类型 变量名[,变量名];

(2) 用“EXEC SQL”关键字

其一般形式为:

EXEC SQL begin declare section;

数据类型 变量名[,变量名];

···

EXEC SQL end declare section;

在EXEC SQL begin declare section和EXEC SQL end declare section中被定义的变量是宿主变量。宿主变量的类型可以是简单数据类型如整数、字符串、浮点数等,可以是复杂数据类型如dec_t、dtime_t等。SQL变量与宿主变量类型的对应如表2所示。

Simple Types Non-Simple Types

SQL C Host SQL C Host

CHAR(n)

SMALLINT

INTEGER

SMALLFLOAT

REAL

FLOAT

SERIAL

DATE

char[n+1]

short

long

float

double

long

long

DECIMAL

DEC

NUMERIC

MONEY

DATETIME

INTERVAL

VARCHAR

dec_t or

struct decimal

dec_t or

struct decimal

dtime_t or

struct dtime

intrvl_t or

struct intrvl

varchar or

string

表2

 宿主变量的使用

在嵌入的SQL语句中,需要标识出宿主变量。为区分宿主变量与SQL语句中其它的名字(如列名、表名等),在宿主变量前加上一个冒号(:)或“$”符,ANSI 标准使用的是“:”。让我们看看几个使用宿主变量的例子。

(1) 宿主变量名可与数据库表中的列名相同;

EXEC SQL update customer

set zipcode = :zipcode

where customer_num = :customer_num;

(2) 宿主变量名区分大小写;

INFORMIX ESQL/C 程序开发

4

EXEC SQL begin declare section;

long customer_num;

long Customer_num;

EXEC SQL end declare section;

customer_num与Customer_num是两个不同的宿主变量。

(3) 宿主变量可用于C语句中;

EXEC SQL begin declare section;

char dbname[11];

EXEC SQL end declare section;

gets(dbname);

EXEC SQL database :dbname;

(4) 在定义宿主变量段可使用typedef语句(用户类型定义语句);

EXEC SQL begin declare section;

typedef short smallint;

typedef long date;

smallint stocknum;

date orderdate;

EXEC SQL end declare section;

(5) 宿主变量定义为结构变量;

EXEC SQL begin declare section;

struct stock_t{

short stocknum;

char manucode[4];

}stockrec1;

struct stock_t stockrec2;

EXEC SQL end declare section;

结构型宿主变量在SQL语句中作整体赋值,如:

EXEC SQL insert into stock

VALUES (:stockrec2);

(6) 宿主变量定义为数组变量;

EXEC SQL begin declare section;

char *buf[6];

static long unit[6]=(0,0,0,0,0,0);

EXEC SQL end declare section;

在数据类型定义时,可对宿主变量进行初始化,与C语言的变量定义一样。

 SQL数据与宿主变量数据类型的相容

当数据由数据库传人ESQL/C程序时,宿主变量的类型应与SQL数据类型相容,反之亦然。其类型兼容性请参考表2。

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

1.2.3 INFORMIX ESQL/C编译器的支持

前面介绍过INFROMIX ESQL/C的编译命令esql,除了处理嵌入的SQL语句,还处理以下几个内容:

INFORMIX ESQL/C 程序开发

5

(1) 嵌入的SQL语句中的注释

在嵌入的SQL语句中可以加上程序注释。除了C语言中支持的注释方法:/*注释信息*/,还有一种注释方法,那就是用双减号(--)来标识该行在双减号之后的信息为注释。

如:

EXEC SQL delete --has no order

from customer;

(2) 包含其它文件

在ESQL/C程序中,可以通过include语句包含其它的源文件。例如,在一个单独的文件中定义程序的全局变量,各个引用全局变量的源程序在文件头部将此文件包含进来。当源文件中没有SQL语句时,使用C语言的#include语句;当源文件中有SQL语句时,使用以下方式来包含文件:

$include filename;

或EXEC SQL include filename;

在$INFORMIXDIR/incl/esql目录下,有九个可用的头文件,它们是:

sqlca.h 用于存储SQL语句执行后的状态

decimal.h 使用DECIMAL类型时,包含该文件

datetime.h 使用DATETIME和INTERVAL类型时,包含该文件

varchar.h 使用VARCHAR类型时,包含该文件

locator.h 使用BYTE和TEXT类型时,包含该文件

sqlda.h 使用动态SQL语句编程时,包含该文件

sqlstypes.h 使用动态SQL语句编程时,包含该文件

sqltypes.h 使用C和SQL的数据类型常量值时,包含该文件,多数情况是在用动态SQL语句时

sqlxtype.h 在X/OPEN模式下使用C和SQL的数据类型常量值时,包含该文件

INFORMIX ESQL/C的预编译器在遇到ESQL/C中的include语句时,如果文件名没有指定绝对路径时,查找包含文件的顺序是首先查找当前目录,然后在$INFORMIXDIR/incl/esql目录下查找,最后到/usr/include目录下查找。一旦在上述三个目录下找到,则停止查找;否则程序编译出错。

(3) 条件编译

INFORMIX ESQL/C中支持条件编译语句,语句的书写形式与C的条件编译类似。例如:

EXEC SQL define USERTRANSACTIONS;

EXEC SQL ifdef USERTRANSACTIONS;

EXEC SQL begin work;

EXEC SQL endif;

1.2.4 ESQL/C的数据类型

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

 简单数据类型

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

INFORMIX ESQL/C 程序开发

6

和DATE类型。

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

对于数值类型的数据,在算术表达式中都当作DECIMAL数据类型对待。DEC IMAL数据类型的格式是这样的: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,1990年1月1日为1,依此类推。DATE类型与字符串类型可相互转换,参见INFORMIX ESQL/C的库函数。

 复杂数据类型

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

(1) DECIMAL数据类型

DECIMAL数据类型是可表示一切数值型的数据,所表示的数据范围为:10×10^-128-10×10^+126;在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 最小修饰粒度 变量名

最大修饰粒度和最小修饰粒度从以下几个关键字中选取:

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类型定义的形式一般为:

INFORMIX ESQL/C 程序开发

7

VARCHAR str(n,m),n表示str的最大长度,m表示str的最小长度。

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

1.2.5 几个常用SQL语句的写法

(1) INSERT 语句

INSERT语句的一般形式为:

INSERT INTO 表名[(columnList)]

VALUES (valueList)

valueList可以是常量值或宿主变量。例如:

EXEC SQL insert into customer (customer_num,fname,lname,company)

values(0,:fname,:lname,”MPS Corp”);

EXEC SQL insert into items

values (:itemrec);

其中列名和要插入的值一一对应。第一个例子的写法与数据库表中列名的顺序无关,第二个例子用结构作整体赋值,若数据库表中列的顺序改变,则程序也要进行相应的变化。

(2) SELECT语句

SELECT语句的一般形式为:

SELECT SelectList INTO 宿主变量列

FROM TableList

[WHERE 查询条件]

例子:

EXEC SQL select * into :custrec

from customer

where customer_num = : cust_num;

其中custrec的域与customer表中的列的结构一一对应。ESQL/C程序中的SELECT语句只能处理返回一行数据的情况。若SELECT语句返回多行数据,则要使用游标来处理。

当从数据库取来的数据出现异常时,这里的异常指某列返回空值或数据发生截断,在INFORMIX ESQL/C中可以定义指示变量来检测。

指示变量是宿主变量的一种,它用于检测SQL语句中数据出现的异常。通常定义为short类型。使用方式为:

a. 要检测的宿主变量 :指示变量

b. 要检测的宿主变量INDICATOR指示变量

例如:

EXEC SQL begin declare section;

char fname[15], lname[15];

short fname_ind, lname_ind;

long cnum;

EXEC SQL end declare section;

cnum = 101;

EXEC SQL select fname ,lname

into :fname :fname_ind ,:lname :lname _ind

from customer

where customer_num = :cnum;

当数据发生截断时,如果是字符型数据则,指示变量的值为截断前的字符串长,如果是

INFORMIX ESQL/C 程序开发

8

数值型转换成字符串型,则指示变量的值大于0,n0 = w ,表示警告。当传进一个NULL值时,指示变量的值小于0。没有异常发生,指示变量的值为0。根据指示变量的值,程序员可以作出相应的处理。

(3) UPDATE语句

UPDATE一般形式是:

UPDATE表名

SET {column-name =expr[,„] |

{(column-list ) |*} =

(value-list) }

[WHERE { condition |

CURRENT OF cursor-name}]

例子:

EXEC SQL update customer

set (fname,lname) = (:fname, :lname)

where customer_num = :cust_num;

WHERE后接CURRENT OF是使用了游标的情况,语句的含义为:更新游标指向的当前行。

(4) DELETE语句

DELETE语句的一般形式为:

DELETE FROM 表名

WHERE 条件

例子:

EXEC SQL delete from orders

where customer

num = customer_num;

1.3 INFORMIX ESQL/C中常用的SQL语句的异常检测方法

1.3.1 SQLCA

在ESQL/C程序中,每执行一条SQL语句,数据库服务器将向程序的一个指定区域返回反馈信息,反馈的信息包括:最近执行的SQL语句的完成状态、运行信息和警告信息。信息被存放的区域就是SQLCA(SQL Communication Area)。SQLCA的结构如下:

struct sqlca_s{

long sqlcode;

char sqlerrm[72]; /*错误信息*/

char sqlerrp[8]; /*现在不用*/

char sqlerrd[6];

struct sqlcaw_s{

char sqlwarn0;

char sqlwarn1;

char sqlwarn2;

char sqlwarn3;

char sqlwarn4;

char sqlwarn5;

char sqlwarn6;

char sqlwarn7;

}

INFORMIX ESQL/C 程序开发

9

}

SQLCA结构在sqlca.h中定义。只要在ESQL/C程序中用到SQLCA,就必须包含该文件。下面一一解释SQLCA各域的含义。

(1)sqlcode表示SQL语句的执行状态。当sqlcode <0时,说明SQL语句执行错误;当sqlcode=0时,说明SQL语句执行成功;sqlcode为1到99的值时,描述动态SQL语句的类型;sqlcode= 100,表示SELECT语句或FETCH语句没有返回行。

(2)sqlerrd[6]描述SQL语句运行的信息:

sqlerrd[0]:用于动态SQL语句,估计返回的行数;

sqlerrd[1]:INSERT语句后的SERIAL值或ISAM(索引顺序访问方法〕错误码;

sqlerrd[2]:语句实际处理的行数;

sqlerrd[3]:用于动态SQL,估计语句执行开销;

sqlerrd[4]:SQL语句中出错字符的偏移量;

sqlerrd[5]:INSERT行的ROWID。

(3)sqlwarn描述数据异常及其它信息

sqlwarn0=w:如果sqlwarn1到sqlwarn7中有一个值为“w”

sqlwarn1= w:如果字符串被截断或打开有事务的数据库

sqlwarn2= w:如果聚集函数遇到了空值或打开ANSI数据库

sqlwarn3= w:select的列数与INTO子句中的宿主变量数不同,或打开Online数据库;

sqlwarn4= w:Update或Delete语句被PREPARE,而语句中没有用where子句;或者使用了float到decimal类型的转换。

sqlwarn5= w:运行了INFORMIX对ANSI SQL的扩充语句;

sqlwarn6= w:现在不用;

sqlwarn7= w:现在不用。

在程序中,每执行完一条SQL语句后先检查SQLCODE的值,SQLCODE是INFORMIX ESQL/C定义的全局变量,它的值与e的值相同。当SQLCODE的值小于0时,可以用库函数rgetmsg来取得错误信息。例如:

char ErrMsgGc[512];

$char DbNameLc[19];

main()

{

gets(DbnameLc);

$database DbNameLC

if (SQLCODE!=0){

rgetmsg((short)e,ErrMsgGc,sizeof(ErrMsgGc));

printf(“Error %d:%s/n”,SQLCODE,ErrMsgGc);

}

}

1.3.2 WHENEVER语句

WHENEVER语句是自动异常检测语句。INFORMIX ESQL/C程在执行时可能出现三种异常,即当SQLCODE = 100时为NOT FOUND异常,当SQLCODE<0时为SQLERROR异常,当n0 = w时为SQLWARNING异常。WHENEVER语句在ESQL/C程序被编译时,告诉编译器在语句执行发生异常时需要做什么。WHENEVER语句的一般形式为:

WHENEVER 异常 动作

INFORMIX ESQL/C 程序开发

10

异常可为NOT FOUND、SQLWARNING和SQLERROR之一;

动作可为:[GO TO|GOTO] lable,CALL function,STOP or CONTINUE;

例如:

WHENEVER SQLERROR STOP表示一旦遇到错误时EXEC/C程序停止运行;

WHENEVER SQLWARNING CONTINUE表示遇到警告时,忽略警告继续执行程序;

WHENEVER NOT FOUND CALL notfound()表示发生NOT FOUND异常时,程序调用函数notfound();

GOTO语句在ESQL/C中不常用。

WHENEVER语句的作用范围为模块。当对于某个异常作处理的WHENEVER语句出现后,在它之后的SQL语句异常都按这种处理方式来做,直到文件结束或者到另一个处理同样异常的WHENEVER语句。

这节介绍的两种错误处理方法第一种比较常用,这是因为SQLCA的方法对每个SQL语句的异常单独处理,程序块的移动不会导致程序运行逻辑的改变。而WHENEVER语句则不同,它不如SQLCA灵活好用。

1.4 游标的定义和使用

1.4.1 游标的分类

前面介绍的SELECT语句只能处理返回一行数据的情况,当SELECT语句返回多个数据行时,必须使用游标。

游标是指向SELECT语句查询出的多行数据的指针,SELECT语句查询出的行组成一结果表,称为活动集。游标指向的行称为当前行。一般说来,游标分为三类:

(1) 滚动游标

(2) 非滚动游标

(3) 更新游标

滚动游标是指程序可以根据需要指向活动集的某一行数据,即游标的位置可来回移动。非滚动游标是指活动集中的每行只能依次被读出。更新游标是非滚动游标,它的特点在于:数据库对游标指向的当前行加锁,当程序读下一行数据时,本行数据解锁,下一行数据加锁。锁加在数据库基本表对应的行上。

本节着重介绍滚动游标。

定义和使用游标的语句与游标相关的语句有五个:

(1) DECLARE语句

这条语句用来定义游标,其一般形式是:

DECLARE 游标名 [SCROLL] CURSOR FOR SELECT语句

有关键字SCROLL的DECLARE语句定义的是滚动游标。SELECT语句可表为:

SELECT 子句

[INTO子句]

FROM子句

[WHERE子句]

[GROUP BY子句]

[HAVING子句]

[ORDER BY子句]

[INTO TEMP子句]

DECLARE语句的作用是在数据库系统表中分配该游标资源,给游标一个自己的名字。游

INFORMIX ESQL/C 程序开发

11

标名的作用范围是只要游标不被释放(FREE),在定义它的模块内有效。

(2) OPEN语句

在取得游标中的数据之前必须先执行OPEN语句来打开游标。OPEN语句的形式是:

OPEN游标名

OPEN语句的作用是,把SELECT语句送到SQL语句检查器中分析,决定活动集的内容,为SELECT语句的结果分配一块内存空间。对于打开滚动游标来说,还要建一个临时表。同时,OPEN语句把游标定位到活动集的第一行。

(3) FETCH语句

FETCH语句的一般形式:

FETCH [位置] 游标名 [INTO variable-list]

位置可以是这些关键字之一:NEXT,PREVIOUS,PRIOR,FIRST,LAST,CURRENT,RELATIVE

n,ABSOLUTE n;FETCH 中的INTO子句与SELECT语句中的INTO子句,二者必居其一。INTO关键字后跟宿主变量。

FETCH语句的作用是使游标定位到活动集的某行上。不管是否带有选择项,FETCH在完成游标的定位后,如果游标定位在活动集上,则把游标所在行的各列值分别赋给INTO子句中的各变量,如果游标定位在活动集以外,则把全局变量status的值置为NOTFOUND。当游标定位在活动集第一行时执行FETCH PREVIOUS语句,或者,当游标定位在活动集最后一行时执行FETCH NEXT语句都会把游标定位到活动集以外。因此,使用FETCH语句时,经常要检查status的值是否等于NOTFOUND,以便进一步的操作。

(4) CLOSE语句

关闭游标,CLOSE语句的一般形式是:

CLOSE游标名

执行这条语句会释放OPEN语句分配的存储资源。需要再用该游标时,执行OPEN语句。

(5) FREE语句

FREE语句将把登记在系统表中的游标名删除,此后便不能再OPEN该游标了。

1.5 动态SQL语句

嵌入式的SQL有两种主要的形式:静态的SQL和动态的SQL。静态的SQL语句是在编写程序时要定义所有的SQL语句,如INSERT、SELECT等普通的SQL语句。动态的SQL之中,SQL语句可以被应用程序在运行时构造。

当应用程序不知道那些需要提前在数据库上执行的所有操作时,或操作的组合数目很大,以至于与其在静态SQL中把所有可能的组合都编码,倒不如动态第在程序中建立SQL串来得容易些。动态SQL中使用参数代替了宿主变量,这些参数可以嵌入在SQL语句中,并且在以后被值替换。动态SQL语句在提高性能方面还有不小的影响。

动态SQL的特性为:语句的说明与执行分为两步。第一步,PREPARE语句用于分析SQL语句,并且在必要时建立一个程序计划;第二步,用EXECUTE或定义游标来执行被预备好的SQL语句。这样一旦一条SQL语句经过预备处理后,就可重复执行它多次。假如仅执行一次的SQL,语句,那就不必做预备处理。

PREPARE语句的一般形式为:

PREPARE语句标识名from “SQL语句”;

或PREPARE语句标识名from :宿主变量;

EXECUTE语句的一般形式为:

EXECUTE被预备的语句标识名 [using宿主变量列]

例如:

int cust_update(cnum,lname)

INFORMIX ESQL/C 程序开发

12

{

exec sql begin declare section;

parameter long cnum;

parameter char *lname;

exec sql end declare section;

static int first = 1;

if (first){

first =0;

exec sql prepare p1 from

“update customer set lname = ? where cus_num = ?”;

sqlerr();

}

esql sql execute p1 using :lname, :cnum;

sqlerr();

}

INFORMIX ESQL/C动态SQL编程方法的详细内容,请参考INFORMIX ESQL/C manual book.


本文标签: 语句 变量 游标 程序 数据