ESQLC编程培训教材Word文档格式.docx
《ESQLC编程培训教材Word文档格式.docx》由会员分享,可在线阅读,更多相关《ESQLC编程培训教材Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
1.4错误诊断2
1.5ESQL/C程序的编译4
二C语言程序中嵌入的SQL语句5
2.1有关数据库和表的权限5
2.1.1选择数据库(DATABASE)5
2.1.2关闭数据库(CLOSEDATABASE)5
2.1.3创建表(CREATETABLE)5
2.1.4删除表(DROPTABLE)5
2.2数据查询语句SELECT5
2.3插入语句INSERT7
2.4数据修改语句UPDATE7
2.5数据删除语句DELETE7
2.6PREPARE语句8
三游标8
3.1滚动游标8
3.1.1DECLARE8
3.1.2OPEN9
3.1.3FETCH9
3.1.4CLOSE10
3.1.5FREE10
3.2更新游标11
一概述
一.1SQL语句嵌入方法
任何可以交互式输入的SQL语句,例如数据定义语句、数据检索语句、数据控制语句等,都可以嵌入到C程序中。
可以使用两种方法指明SQL语句:
一种是在SQL语句之前用“$”作为前缀,如:
#include<
stdio.h>
main()
{
$databasebook;
$deletefrombookwherebook_num=100;
…
}
另一种是在SQL语句之前使用ANSI标准的EXECSQL关键字来标识,如:
EXECSQLdatabasebook;
EXECSQLdeletefrombookwherebook_num=100;
一.2宿主变量
SQL语句中可以有变量,变量可以出现在交互式SQL语句中常量可以出现的任何位置,SQL语句中的这种变量称为宿主变量。
INFORMIX-ESQL/C程序通过宿主变量在C语句和SQL语句中传递数据。
一般情况下,在宿主变量前加“$”符来标识。
如:
$updatebooksetbook_price=$fNewPrice;
在定义宿主变量时也需要在定义语句前用“$”符来标识,如:
$intiNumber;
$charname[10];
$structstudent{
intno;
charname[10];
}stu;
另外,宿主变量可以像C语言变量一样用在C语言表达式中,如:
$chardbname[11];
gets(dbname,80);
$database$dbname;
一.3头文件
INFORMIX-ESQL/C提供了许多头文件,其中最常用的是sqlca.h,它用于确定SQL语句的返回值和SQL语句执行后的其他信息,在ESQL/C程序中是必须包含的,包含方法是“$includesqlca”。
另外,如果自定义的头文件中包含SQL语句或宿主变量的定义,也必须用同样的方法进行说明,如:
$includefilename。
如果源文件在某个路径下,应将其用引号括起来,如:
$includesqlca;
$includexyz.h;
$include"
/users/test/test.h"
;
一.4错误诊断
在INFORMIX-ESQL/C程序中执行一条SQL语句时,数据库服务器会返回几种信息,反映SQL语句的执行情况,包括:
●该SQL语句的完成状况;
●有关性能的信息;
●有关可能发生或已经发生的事情的警告。
这些返回信息传送到一个称为sqlca的结构中,该结构定义在sqlca.h中:
structsqlca_s{
longsqlcode;
charsqlerrm[72];
charsqlerrp[8];
longsqlerrd[6];
structsqlcaw_s{
charsqlwarn0;
charsqlwarn1;
charsqlwarn2;
charsqlwarn3;
charsqlwarn4;
charsqlwarn5;
charsqlwarn6;
charsqlwarn7;
}sqlwarn;
}sqlca;
上述sqlca结构中的信息反映了INFORMIX-ESQL/C语句执行后的情况:
成功或异常,其中异常情况包括三种:
(1)执行成功,但没有找到记录;
(2)执行成功,但出现警告信息;
(3)执行结果失败。
可通过sqlcode来检测SQL语句的执行结果,其含义如下:
●sqlcode=0时,说明语句执行成功;
●sqlcode=100,说明在执行Select或Fetch查找操作后返回零记录,在sqlca.h中将宏SQLNOTFOUND定义为100;
●sqlcode<
0时,说明SQL语句执行后有错误发生
以下是一个简单的ESQL/C程序:
$charfname[15];
$charlname[20];
inti;
printf("
ThisisaESQL/CProgram!
\n"
);
$databasebook;
$declaredemocursorcursorfor
selectfname,lnameinto$fname,$lname
frombookname
wherelname>
"
C"
$opendemocursor;
for(;
;
){
$fetchdemocursor;
if(sqlca.sqlcode)
break;
printf("
%s%s\n"
fname,lname);
}
$closedemecursor;
\nProgramOver.\n"
一.5ESQL/C程序的编译
用INFORMIX-ESQL/C语句编写的程序在使用C编译程序之前必须预处理,预处理程序把嵌入的语句转换成C语言程序。
INFORMIX-ESQL/C提供了编译命令esql,用来编译INFORMIX-ESQL/C源代码,这些源代码的名称必须具有.ec后缀才能进行转换。
转换后的结果存在与源文件同名但后缀为“.c”的文件中,然后调用C编译器将.c文件转换成以.o为后缀的目标文件,最后调用C语言标准库和INFORMIX-ESQL/C库以及用户自己所链接的库生成可执行文件。
二C语言程序中嵌入的SQL语句
二.1有关数据库和表的权限
二.1.1选择数据库(DATABASE)
功能:
DATABASE语句用来选择已存在的数据库,使其成为当前数据库。
格式:
DATABASEdatabase_name
二.1.2关闭数据库(CLOSEDATABASE)
关闭当前数据库。
CLOSEDATABASE
二.1.3创建表(CREATETABLE)
在当前数据库中建立一张新表。
CREATE[TEMP]TABLEtable_name
(column_namedatatype[NOTNULL],…)
二.1.4删除表(DROPTABLE)
删除一个已存在的表,以及相关的索引和数据。
DROPTABLEtable_name
二.2数据查询语句SELECT
数据查询语句SELECT的执行结果有三种情况:
●没有满足条件的记录;
●返回单个记录;
●返回多个记录。
前两种情况可以使用单个的SELECT语句,最后一种情况必须使用游标进行查询。
SELECT子句
[INTO子句]
FROMTableList
[WHEREFilterJoin]
[GROUPBYColumnGroupList]
[HAVINGGroupFilter]
[ORDERBYOrderFilter]
[INTOTERMTable]
说明:
INTO子句检索出来的数据存放的宿主变量
INTOTEMPTable将检索处理的结果存在至临时表
SELECT如果返回多个记录,必须通过游标方式进行处理。
如果返回单条记录,我们将该语句称为单记录SELECT语句,如果有记录返回,sqlca.sqlcode则被设置为0,如果没有满足条件的记录,sqlca.sqlcode则被设置为SQLNOTFOUND,以下是对单记录SELECT语句操作的示例:
$charfj[11],zh[10],xb[20];
$doublezhxb;
$SELECTfj,zh,xb,zhxbinto
$fj,$zh,$xb,$zhxb
frombook
wherebook_num=100;
if(sqlca.slqcode==SQLNOTFOUND)
没有满足条件的记录\n"
if(sqlca.sqlcode==0){
书名:
%s\n"
fj);
作者:
zh);
出版社:
xb);
定价:
%.2f\n"
zhxb);
二.3插入语句INSERT
INSERT语句的主要目的是在表中增加一条或多条新记录。
INSERTINTOtable_name
[(ColumnList)]
VALUES(valuelist)
示例:
$INSERTINTOCustomer(customer_num,fname,lname,company)
VALUES(0,$Firstname,$Lastname,"
JOHNCORP"
二.4数据修改语句UPDATE
UPDATE语句用来改变一个或多个记录中的一个或多个字段的值。
UPDATEtable_nameSET
{column_name=expr[,…]|(column_list)=(expr_list)}
[WHEREcondition]
$UPDATEcustomerSET
(fname,lname)=($Fname,$Lname)
WHEREcustomer_num=$cust;
二.5数据删除语句DELETE
删除语句DELETE从数据库表中删除一个或多个记录。
DELETEFROMtable_name
[WHERE{condition}]
$DELETEFROMbook
WHEREbook_num=$booknum;
二.6PREPARE语句
PREPARE语句显示地请求对SQL语句进行语法分析。
PREPAREstatement_nameFROMstring_spec
$PREPAREDelFROM
"
deletefrombookwhereboo_num=?
if(SQLCODE<
0){//SQLCODE=sqlca.sqlcode
prepareDelErrorsqlcode=%d\n"
SQLCODE);
exit(-1);
while(…){
…
$EXECUTEDelUsing$book10;
三游标
三.1滚动游标
三.1.1DECLARE
DECLARE定义一个游标,它给游标命名并把一个查询同一个游标相关联。
DECLAREcursor_nameCURSORFORselectstmt
$declareC1cursorforselectxy1,xy2into$xy1,$xy2fromfj;
三.1.2OPEN
OPEN语句激活游标并开始执行相关联的SELECT语句
OPENcursor_name
$declarecustptrscrollcursorforselect*fromcustomerwherezipcode=$zip;
$opencustptr;
三.1.3FETCH
FETCH语句把已打开的游标移到一个新的位置,并把记录的字段值存放到INTO子句说明的宿主变量中。
FETCH[position]cursor_name[INTOHOSTVARLIST]
对于一个滚动游标,该新位置可以是活动集中的任意位置。
(4)绝对位置
FIRST取得活动集中的第一个记录。
LAST取得活动集中的最后一个记录。
CURRENT取得当前记录。
ABSOLUTEn取得活动集的第n个记录
(5)相对位置
NEXT取得活动集的下一个记录。
PREVIOUS取得活动集的前一个记录。
RELATIVEn取得相对当前记录的第n个记录,负值向前,正值向后数。
$declarecustptrscrollcursorforselectcustomer_num,lname,fname
fromcustomer
wherezipcode=$zip;
$fetchnextcustptrinto$Cnum,$Lname,$Fname;
当游标成功地移动到指定位置且在该位置有记录时,则SQLCODE值为0,如果没有记录,则返回SQLNOTFOUND(100)。
三.1.4CLOSE
CLOSE语句关闭游标。
CLOSEcursor_name
$declarecustptrscrollforselectcnum,lname,fname
wherezipcode=$zip;
$fetchnextcustptrinto$Cnum,$Lname,$Fname;
$closecustptr;
关闭游标之后,除了OPEN和FREE语句之外,所有其它语句都不能再使用。
三.1.5FREE
FREE语句释放空间和数据服务器中的游标资源。
FREEcursor_name;
$declarecustptrcursorfor
selectcnum,lname,fname
$freecustptr;
三.2更新游标
更新游标只能查看下一条记录,主要在进行修改和删除操作时使用。
DECLAREcursor_nameCURSORFORselect_statement
FORUPDATE[OFcolumn_list]
$declaremycurscursorfor
selectmanu_code,manu_name
frommanufactforupdate;
$openmycurs;
$fetchmycursinto$mfcode,$mfname;
if(user_input==UPDATE){
$updatemanufactset
(manu_code,manu_name)=($mfcode,$mfname)
wherecurrentofmycurs;
if(user_input==DELETE){
$deletefrommanufactwherecurrentofmycurs;