ESQLC编程培训教材Word文档格式.docx

上传人:b****6 文档编号:21253924 上传时间:2023-01-28 格式:DOCX 页数:12 大小:21.39KB
下载 相关 举报
ESQLC编程培训教材Word文档格式.docx_第1页
第1页 / 共12页
ESQLC编程培训教材Word文档格式.docx_第2页
第2页 / 共12页
ESQLC编程培训教材Word文档格式.docx_第3页
第3页 / 共12页
ESQLC编程培训教材Word文档格式.docx_第4页
第4页 / 共12页
ESQLC编程培训教材Word文档格式.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

ESQLC编程培训教材Word文档格式.docx

《ESQLC编程培训教材Word文档格式.docx》由会员分享,可在线阅读,更多相关《ESQLC编程培训教材Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。

ESQLC编程培训教材Word文档格式.docx

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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 视频讲堂

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1