嵌入式SQL-SQC之ESQL编程入门与技巧

上传人:ilkj****kghj 文档编号:156163025 上传时间:2022-09-26 格式:DOCX 页数:39 大小:69.44KB
收藏 版权申诉 举报 下载
嵌入式SQL-SQC之ESQL编程入门与技巧_第1页
第1页 / 共39页
嵌入式SQL-SQC之ESQL编程入门与技巧_第2页
第2页 / 共39页
嵌入式SQL-SQC之ESQL编程入门与技巧_第3页
第3页 / 共39页
资源描述:

《嵌入式SQL-SQC之ESQL编程入门与技巧》由会员分享,可在线阅读,更多相关《嵌入式SQL-SQC之ESQL编程入门与技巧(39页珍藏版)》请在装配图网上搜索。

1、ESQL编程使用说明1.1 第一章 ESQL介绍 本章对ESQLL做一概括介介绍,主要讨讨论怎么使用用ESQL、EESQL的基基本的概念和和定义、ESSQL程序的的各个部分和和ESQL 程序中语句句的类型. SQL语言是非非过程化语言言,大部分语语句的执行与与其前面或后后面的语句无无关,而一些些高级编程语语言都是基于于如循环,条条件等结构的的过程化语言言,尽管SQQL语言非常常有力,但它它却没有过程程化能力.若若把SQL语语言嵌入到过过程化的编程程语言中,则则利用这些结结构,程序开开发人员就能能设计出更加加灵活的应用用系统,具有有SQL语言言和高级编程程语言的良好好特征,它将将比单独使用用SQ

2、L或CC语言具有更更强的功能和和灵活性. COBASE RDBMSS提供两种工工具在主语言言中编程来存存取COBAASE数据库库中的数据.即高级语言言预编译程序序接口(ESSQL)和高高级语言的函函数调用接口口(CCI).目前这些些工具仅支持持C语言. COBASE RDBMSS提供的ESSQL工具把把含有SQLL语句的C程程序转化为可可存取和操纵纵COBASSE数据库中中数据的C程程序,作为一一编译器,EESQL把输输入文件中的的EXEC SQL 语语句在输出文文件中转化为为适当的CCCI函数调用用.输出文件件则可以正常常的C程序的的方式被编译译、连接和执执行. 1.1.1 ESQL中的基基

3、本概念 ESQL中的基基本概念主要要有: 1.嵌入的SQQL语句: 嵌入的SQL语语句是指在应应用程序中使使用的SQLL语句.该应应用程序称作作宿主程序,书写该程序序的语言称作作宿主语言.嵌入的SQQL语句与交交互式SQLL语句在语法法上没有太大大的差别,只只是嵌入式SSQL语句在在个别语句上上有所扩充.如嵌入式SSQL中的SSELECTT语句增加了了INTO子子句,以便与与宿主语言变变量打交道.此外,嵌入入式SQL为为适合程序设设计语言的要要求,还增加加了许多语句句,如游标的的定义、打开开和关闭语句句等等. 2.执行性SQQL语句和说说明性SQLL语句: 嵌入的SQL语语句主要有两两种类型:

4、执执行性SQLL语句和说明明性SQL语语句.执行性性SQL语句句可用来连接接COBASSE,定义、查查询和操纵CCOBASEE数据库中的的数据,每一一执行性语句句真正对数据据库进行操作作 ,执行完完成后,在UUSERCAA中存放执行行信息.说明明性语句用来来说明通讯域域和SQL语语句中用到的的变量. 说说明性语句不不生成执行代代码,对USSERCA不不产生影响. 3.事务: 事务是逻辑上相相关的一组SSQL语句.COBASSE把它们视视作一个单元元.为了保持持数据库的一一 致性,一事务内内的所有操作作要么都做,要么都不做做. 1.1.2 ESQL程序的的组成和运行行 在ESQL程序序 中嵌入的

5、的SQL语句句以EXECC作为起始标标识,语句的的结束以;作为标识识.在嵌入的的SQL语句句可以使用主主语言(这时时是C语言)的程序变量量(即主变量量),这时主主变量名前加加冒号(:)作为标志,以区别于字字段名. ESQL程序包包括两部分:程序首部和和程序体.程程序首部定义义变量,为EESQL程序序做准备, 程序体包括括各种SQLL语句来操纵纵COBASSE数据库中中的数据. 编制并运行ESSQL程序比比单独使用纯纯C语言多一一个预编译过过程,通常具具有以下几个个步骤: 1.编辑ESQQL程序(可可利用编辑软软件如: EEDLIN, WS等进进行编辑).程序保后缀缀为.ec. 2.使用COBB

6、ASE的预预编译器ETTE对ESQQL源程序进进行预处理,该编译器将将源程序中嵌嵌入的SQLL语言翻译成成标准C语言言,产生一个个C语言编译译器能直接进进 行编译的的文件.其文文件的扩展名名为.cppp。该cppp文件可以和和普通的cppp文件一样样被放入一个个工程中被CC+编译器器编译,连接接最后运行。 对COBASEE的预编译器器的使用的详详细说明见第第六章. 1.2 第二章 ESQQL 程序的的基本结构 ESQL程序由由两部分组成成:程序首部部和程序体. 1.2.1 程序首部 每一个ESQLL程序的开始始,就是程序序的首部,它它包括以下三三部分: 1.DECLAARE部分: 说明特殊的主

7、变变量,这些变变量区别于纯纯C语言程序序中的变量,COBASSE使用这些些变量与程序序之间相互作作用. 2.INCLUUDE USSERCA语语句: 说明明一个SQLL语句的通讯讯域(USEERCA),它提供了错错误处理,其其功能等价于于代替C语言言中的#INNCLUDEE语句. 3.CONNEECT语句: 建立程序序与COBAASE之间的的连接. 2.1.1DEECLAREE部分:(描描述部分) 在DECLARRE SECCTION (描述部分分),定义所所有在SQLL语句中用到到的主变量,定义部分是是以: EXEC SQQL BEGGIN DEECLAREE SECTTION; 和 EXE

8、C SQL EEND DEECLAREE SECTTION; 开始和结束的. 在这两个语句中中,只可以定定义 SQLL 语句中用用到的主变量量,每个预编编译单元只允允许一个BEEGIN/EEND DEECLAREE SECTTION (描述部分),但是一个个程序可以包包含许多独立立的预编译单单元。若一个个主变量或指指示变量在EESQL程序序中的SQLL语句中引用用,但它没有有在 描述部部分中定义,则程序在预预编译时就会会出现错误信信息. 在这两个语 句句中可以定义义的变量有六六种类型:IINT,SHHORT,CCHAR,FFLOAT,NUMBEER,DATTE.其中CCHAR型允允许定义二维维

9、数组,其它它类型只允许许定义一维数数组,不允许许有指针类型型 ,在此处处变量可以赋赋值. 例如: EXEC SQQL BEGGIN DEECLAREE SECTTION; int snoo; char snname111; short ssnameiid; EXEC SQQL ENDD DECLLARE SSECTIOON; (1)主变量: 就是用在SQLL语句中的主主语言变量.主要用于程程序变量和数数据库内部交交换数据之用用,它们的数数据类型必须须是在主语言言中描述部分分里定义过的的,而且它们们的数据类型型必须和COOBASE数数据库中已定定义的表中的的数据类型相相匹配. 例如: SELEC

10、T 姓名, 等等级 FROM 供应应商 INTO :ssname, :staatus WHERE 供供应商号=:sno; 该语句表示,从从供应商表中中在供应商号号与主变量ssno一致的的地方选择供供应商姓名和和供应商等级级,COBAASE把结果果传送到主变变量snamme,staatus中. 主变量使用规则则: 1.必须在描述述部分明确定定义. 2.必须使用与与其定义相同同的大小写格格式. 3.在SQL语语句中使用主主变量时必须须在主变量前前写一个冒号号:,在在纯C语言 语句中则不不要在主变量量前写冒号. 4.不能是SQQL命令的保保 留字. 5.在一条语句句中只能使用用一次. 2.1.2 S

11、SQL通讯域域 每个COBASSE应用程序序必须提供对对错误 的处处理,为了说说明SQL通通讯域(USSERCA),必须在每每个COBAASE预编译译程序中写上上: EXEC SQQL INCCLUDE USERCCA; USERCA是是一结构,每每一嵌入的执执行性SQLL语言的执行行情况在其执执行完成后写写入USERRCA结构中中的各变量中中, 根据UUSERCAA中的内容可可以获得每一一嵌入SQLL语句执行后后的信息,编编制程序时就就可以做适当当的处理.对对其的详细说说明见第五章章. 2.1.3 连连接COBAASE 在 存取COBBASE数据据之前,每一一个预编译程程序必须与CCOBAS

12、EE连接.连接接时,程序必必须提供用户户名和口令,由COBAASE进行校校验,若口令令和用户名正正确,方可登登录COBAASE,获得得使用权,否否则,COBBASE拒绝绝登录,则程程序就不能使使用数据库.缺省的用户户名为“cobasse”,口令为“cobasse”。 连接COBASSE的格式如如下: EXEC SQQL CONNNECT :. CONNECTT语句必须是是ESQL程程序中第一条条可执行的SSQL语句. 1.2.2 程序体 程序体可以包含含许多SQLL语句,以查查询或处理存存储在COBBASE数据据库中的数据据. 在应用程序中所所包含的SQQL语句,可可以查询或操操纵存储在CCO

13、BASEE中的数据,这些语句叫叫 做数据操纵语言言(DML),应用程序序体也可以包包含DDL语语句,用来建建立或定义数数据结构,如如表、视图或或索引.在用用户程序中写写入的任何有有效的SQLL语句都可以以被执行,只只需要把完整整的SQL语语句按嵌入式式的要求写入入C语言的合合适位置即可可.嵌入在CC语言中的SSQL语句以以EXEC SQL 开开始,以;为结束标标志.SQLL语句中可以以嵌入主变量量,主变量前前应有:标志.如下下面例子都 是嵌入式SSQL语句: EXEC SQQL UPDDATE 供供应商 SET 姓名=李 红 WHERE 供供应商号=S1; /* 把供应商商号是S1的的供应商姓

14、名名改为 李李 红*/ EXEC SQQL INSSERT IINTO 供供应商(供应应商号,姓名名,等级,城城市) VALUES(:snoo,:snaame,:sstatuss,:citty); /* 根据宿主主变量值插入入供应商表中中 */ EXEC SQQL DELLETE FFROM 供供应商 WHERE 等等级 IS NULL; /*删除供应商商等级是空值值的供应商*/ 从上面例可以看看出,静态的的增,删,改改语句与交互互方式没有太太大的差别,对于查询语语句就没有那那么简单,查查询语句在下下一章中介绍绍. 现用几个例题程程序加以说明明. 例题程序1 (建立一表并并向表中插入入数据)

15、/*= This iss a saample progrram whhich iincludde SQLL senttence aboutt CREATE ,INSEERT a tablee. =*/ EXEC SQQL BEGGIN DEECLAREE SECTTION ; CHAR snno10,snamme10,cityy10; INT staatus; EXEC SQQL ENDD DECLLARE SSECTIOON ; EXEC SQQL INCCLUDE USERCCA; main() int i; EXEC SQQL CONNNECT cobaase:coobase ; EXE

16、C SQQL CREEATE TTABLE S_TESST /* Creatte a ttable namedd S_TEEST */ (SNO CHHAR (99), SNAME CCHAR (20), STATUS INT ,CITY CHAR(10); printf( creeate ttable succeess,innsert?); printf( 0 - nno ); printf( 1 - yyes ); printf( chooice:); scanf(%d,&i); while(ii) printf(inpuut snoo:); scanf(%s,ssno); printf(

17、inpuut snaame:); scanf(%s,ssname); printf(inpuut staatus:); scanf(%d,&statuus); printf(inpuut citty:); scanf(%s,ccity); EXEC SQQL INSSERT IINTO SS_TESTT(SNO,SNAMEE,STATTUS,CIITY) VALUES (:snno,:snname,:statuus,:ciity); printf(conttinue?); printf( 0 -teerminaate ); printf( 1 -coontinuue ); printf( ch

18、ooice:); scanf(%d,&i); EXEC SQQL COMMMIT; EXEC SQQL DISSCONNEECT; /*log off ddatabaase*/ exit(0); 例题程序2 (修改和删除除表中的数据据) /*= This iss a saample progrram whhich iincludde SQLL senttence aboutt UPDATE,DELETTE a ttable. =*/ EXEC SQQL BEGGIN DEECLAREE SECTTION ; CHAR snno10,snamme10,cityy10; INT staatus;

19、EXEC SQQL ENDD DECLLARE SSECTIOON ; EXEC SQQL INCCLUDE USERCCA; main() int i; printf(Now exec conneect .); EXEC SQQL CONNNECT COBAASE:COOBASE ; printf( upddate?); printf( 0 - nno ); printf( 1 - yyes ); printf( chooice:); scanf(%d,&i); while(ii) printf(inpuut snoo:); scanf(%s,ssno); printf(inpuut sna

20、ame:); scanf(%s,ssname); printf(inpuut staatus:); scanf(%d,&statuus); printf(inpuut citty:); scanf(%s,ccity); EXEC SQQL UPDDATE SS_TESTT SET snamee=:snaame,ciity=:ccity ,statuus=:sttatus WHERE ssno=:ssno; printf( conntinuee?); printf( 0 -noo ); printf( 1 -yees ); printf( chooice:); scanf(%d,&i); pri

21、ntf( dellete?); printf( 0 - nno ); printf( 1 - yyes ); printf( chooice:); scanf(%d,&i); while(ii) printf(inpuut snoo:); scanf(%s,ssno); EXEC SQQL DELLETE FFROM SS_TESTT WHERRE snoo=:snoo; printf( conntinuee?); printf( 0 -noo ); printf( 1 -yees ); printf( chiioce:); scanf(%d,&i); EXEC SQQL COMMMIT; E

22、XEC SQQL DISSCONNEECT; exit(0); 1.3 第三章 查 询询 在ESQL程序序中,查询可可以分为两大大类型:返回回一行的查询询和返回多行行的查询.对对于查询,我我们不仅对其其执行得成功功与否感兴趣趣,其结果更更为有用.多多行查询要用用到游标的概概念,本章就就介绍查询语语句和游标的的概念和使用用. 1.3.1 SELECT 语句 SELECT语语句是用于完完成查询功能能的SQL语语句,查询语语句因为有返返回的结果,故ESQLL中的SELLECT语句句比SQL的的SELECCT语句多一一INTO子子句,INTTO子句的主主变量表对应应于程序中主主变量,用于于存放查询返返

23、回的结果. SELECT语语句格式如下下: EXEC SQQL SELLECT ,. INNTO FROM ,. WHHERE ; 其中:1.检索索条件中允许许有主变量和和嵌套子查询询语句. 2.INTO后后的主变量可可以是数组. 3.主变量前要要用:标标志. 执行该语句时,COBASSE找出表中中满足检索条条件的行,并并把结果传送送到INTOO子句中所对对应的主变量量中.该语句句的查询结果果可以是一行行或多行.WWHERE后后的主变量叫叫输入主变量量,它提供了了查询所需的的信息.INNTO子句中中的主变量叫叫输出主变量量,它保存SSELECTT语句运行后后的结果. 例题程序3 (返回一行的的

24、查询) /*= This iss a saample progrram whhich uuses SSELECTT stattementt of EEsql. It is aan exaample of hoow to do quueriess thatt retuurn onne roww. =*/ EXEC SQQL BEGGIN DEECLAREE SECTTION ; INT staatus; CHAR snno10,snamme10,cityy10,isno10; EXEC SQQL ENDD DECLLARE SSECTIOON ; EXEC SQQL INCCLUDE USERC

25、CA; main() EXEC SQQL CONNNECT cobaase:coobase ; /* log into COBASSE */ printf(inpuut thee sno for uupdatee:); scanf(%s,ssno); EXEC SQQL SELLECT ssno,snname,sstatuss,cityy INTO :ssno , :snamme ,:sstatuss,:citty from S_TEST WHEREE sno=:sno; printf(sno: %s ;,snoo); printf(snamme: %ss ;,ssname); printf(

26、stattus: %d ;,statuus); printf(cityy: %s ;,ciity); EXEC SQQL COMMMIT; EXEC SQQL DISSCONNEECT; exit(0); 例题程序4 (返回多行的的查询) /*= This iss a saample progrram whhich uuses SSELECTT stattementt of EEsql. It is aan exaample of hoow to do quueriess thatt retuurn moore thhan one roww. =*/ EXEC SQQL BEGGIN DEEC

27、LAREE SECTTION ; INT staatus110; CHAR snno1010,snamee1015,ccity110200,isnno10; EXEC SQQL ENDD DECLLARE SSECTIOON ; EXEC SQQL INCCLUDE USERCCA; main() int ii; EXEC SQQL CONNNECT cobaase:coobase ; /* log into COBASSE */ for(i=00;i100;i+) strcpy(snoii,tttttt); strcpy(snameei,tttttt); strcpy(cityi,ttttt

28、t); statusi=10000; EXEC SQQL SELLECT ssno,snname,sstatuss,cityy INTO :ssno , :snamme ,:sstatuss,:citty from S_TEST; printf(sno snamee stattus ciity); for(i=00;i100;i+) printtf(%88s %8ss %8d %8s ,snoi,snnameii,staatusii,cittyi); getcharr(); EXEC SQQL COMMMIT; EXEC SQQL DISSCONNEECT; 1.3.2 游标的使用 我们知道S

29、QLL语言是一种种面向集合的的语言,而普普通的高级语语言则是面向向记录的语言言,要想使SSQL语言能能与宿主语言言通讯,ESSQL提供了了游标操作,能把SQLL的集合操作作结果,按单单个记录方式式取出,赋于于主变量进行行进一步的处处理. 如果查询结果返返回多行或不不知返回多少少行,就可使使用带游标的的SELECCT语句.一一个游标(CCURSORR)是一个CCOBASEE和ESQLL使用的工作作区域,COOBASE使使用这个工作作区存放着一一个查询结果果 .一个已已命名的游标标是和一条SSELECTT语句相关联联.一个游标标必须首先定定义(同一个个查询相关联联),然后用用三条可运行行的SQL语

30、语句使用游标标,以操纵数数据.四条操操纵游标的命命令如下: .DECLREE CURSSOR .OPEN CCURSORR .FETCH .CLOSE CURSOOR DECLAREE CURSSOR 语句句用来定义一一游标,此时时游标处于关关闭状态.用用OPEN CURSOOR语句打开开游标后,就就可用它从相相关的查询中中取出多于一一行的结果.所有满足查查询条件的行行组成一个集集合,叫做游游标活动集.通过FETTCH取操作作,活动集中中的每一行可可以一个一个个的返回,当当查询作完后后,游标就可可以用CLOOSE CUURSOR 语句关闭. 3.2.1DEECLAREE CURSSOR 定义义

31、游标语句: ESQL中的DDECLARRE CURRSOR语句句定义游标,赋给它一个个与查询相关关的游标名.该语句的格格式为: EXEC SQQL DECCLARE CURSSOR FOOR FOR UPDATTE; 其中:(1)SSELECTT语句应不含含INTO子子句. (2)若无FOOR UPDDATE 则则无法 执行行UPDATTE(定位)和DELEETE(定位位)语句. 定义游标的DEECLAREE语句必须出出现在程序中中对游标进行行操作的所有有语句之前, ESQLL不能引 用用没有说明的的游标,游标标的定义范围围是整个程序序.程序中可可包含多个DDECLARRE语 句,这些语句定定

32、义了不同的的游标,并把把游标与不同同的查询联系系在一起,所所以在同一个个程序中的两两个DECLLARE语句句中不能说明明同一个游标标名. 3.2.2 OOPEN CCURSORR 打开游标标语句 ESQL中OPPEN CUURSOR语语句格式如下下: EXEC SQQL OPEEN ; OPEN语句决决定了满足查查询的行的集集合,游标处处于打开状态态,它的活动动集就是满足足WHEREE子句条件的的行的集合.这时,游标标处在活动集集的第一行的的 前面. 3.2.3 FFETCH CURSOOR 语句 ESQL中的FFETCH CURSOOR语句读出出活动集中的的行,并把结结果送到输出出主变量,输

33、输出主变量是是在相关的FFETCH语语句中定义的的.其 格式式如下: EXEC SQQL FETTCH IINTO ; 游标必须先定义义,然后再打打开,只有当当游标处于打打开状态时,才执行FEETCH语句句.在第一次次运行FETTCH时,游游标从活动集集的第一行前前移到当前第第一行,使这这一行成为当当前行.每次次运行FETTCH时游标标在活动集中中向前移,把把选出的结果果送到主变量量表中指定的的输出主变量量中. 如果游标活动集集中是空的,或所有的行行已经被取走走,COBAASE就返回回一代码.(USERCCA.SQLLCODE=20000). 游标只可在活动动集中向前移移动,COBBASE无法

34、法取到已经用用FETCHH取过的行,要想再取这这一行,就必必须关闭游标标,再重新打打开它. 3.2.4 CCLOSE CURSOOR 关闭游游标语句 当取完活动集中中所有行后,必须关闭游游标,以释放放与该游标的的关的资源.其格式如下下: EXEC SQQL CLOOSE ; 例题程序5 (使用游标的的查询) /*= This iss a saample progrram whhich uuses CCursorr.Incllude DDECLARRE, OPEN,FEETCH aand CLLOSE ccursorr namee. It is aan exaample of hoow to d

35、o quueriess thatt retuurn moore thhan one roww. =*/ EXEC SQQL BEGGIN DEECLAREE SECTTION ; INT staatus; CHAR snno10,snamme15,cityy20; EXEC SQQL ENDD DECLLARE SSECTIOON ; EXEC SQQL INCCLUDE USERCCA; main() int i; printf(Now exec conneect .); EXEC SQQL CONNNECT cobaase:coobase ; /* log into COBASSE */

36、printf(Now exec declaare_oppen_feetch_cclose cursoor .); /* Decllare sstatemment nname -s11 forr INSEERT sttatemeent */ EXEC SQQL DECCLARE cursoor1 CUURSOR FOR SSELECTT * FRROM S_TEST; EXEC SQQL OPEEN currsor1 ; printf(sno snamee stattus ciityn ); do EXEC SQQL FETTCH cuursor11 INTOO :snoo,:snaame,:s

37、statuss,:citty ; If (useerca.ssqlcodde=20000) bbreak; printf(%8s %8s %8d %88s n,sno,snamee,stattus,ciity); getcharr(); while(1); EXEC SQQL CLOOSE cuursor11 ; EXEC SQQL COMMMIT; EXEC SQQL DISSCONNEECT; 1.3.3 定位修改和删除除语句 COBASE支支持SQL格格式 CUURRENTT OF CCURSORR.这条语语句将指向一一个游标中最最新取出的行行,以用于修修改和删除操操作.该语句句必须在取

38、操操作之后使用用 ,它等同同于存储一个个ROWIDD,并使用它它.其格式如如下: (1) EXEEC SQLL UPDATE SET = | NUULL , = | NULLL . WHERE CCURRENNT OF ; (2) EXEEC SQLL UPDATE SET ( ) = ( ) WHERE CCURRENNT OF ; (3) EXEEC SQLL DELEETE FRROM WHERE CCURRENNT OF ; 这些语句执行在在游标名的当当前行下更新新或修改.其其中在值表达达式或子查询询中出现的主主变量前应有有:标志志. 例题程序6 (定位删除) /*= This iss

39、 a saample progrram whhich uuses DDELETEE STATTEMENTT at CURRENTT Curssor. =*/ EXEC SQQL BEGGIN DEECLAREE SECTTION ; INT staatus; CHAR snno10,snamme15,cityy20; EXEC SQQL ENDD DECLLARE SSECTIOON ; EXEC SQQL INCCLUDE USERCCA; main() int i; printf(Now exec conneect .); EXEC SQQL CONNNECT COBAASE:COOBAS

40、E ; printf(Now exec declaare cuursor .); EXEC SQQL DECCLARE cursoor1 CUURSOR FOR SELECT sno,ssname,statuus,citty FROOM S_TTEST FFOR UPPDATE; printf(Now exec open cursoor .); EXEC SQQL OPEEN currsor1; printf(sno snamee stattus ciityn); for(;) printf(Now exec fetchh curssor .n); EXEC SQQL FETTCH cuurs

41、or11 INTOO :snoo,:snaame,:sstatuss,:citty; if (useerca.ssqlcodde=20000) bbreak; printf(%8s %8s %8d %88s n,sno,snamee,stattus,ciity); /Delette thee firsst reccord tthat bbe fettched printf( dellete ccurrennt ?(00/1); scanf(%d,&i); if (i=1) EXEC SQQL DELLETE FFROM SS_TESTT WHERE CCURRENNT of cursoor1;

42、 EXEC SQQL CLOOSE cuursor11; EXEC SQQL COMMMIT; EXEC SQQL DISSCONNEECT; 例题程序7 (定位修改) /*= This iss a saample progrram whhich uuses UUPDATEE STATTEMENTT at CURRENTT Curssor. =*/ EXEC SQQL BEGGIN DEECLAREE SECTTION ; INT staatus; CHAR snno10,snamme15,cityy20; EXEC SQQL ENDD DECLLARE SSECTIOON ; EXEC SQ

43、QL INCCLUDE USERCCA; main() int i; strcpy(sno,tttttt); strcpy(snamee,tttttt); strcpy(city,tttttt); status=1000; EXEC SQQL CONNNECT cobaase:coobase ; EXEC SQQL DECCLARE cursoor1 CUURSOR FOR SELECT SNO, SNAMEE, STAATUS,CCITY FFROM SS_TESTT FOR UPDATTE; EXEC SQQL OPEEN currsor1; printf(sno snamee statt

44、us ciityn); for(;) EXEC SQQL FETTCH cuursor11 INTOO :snoo,:snaame,:sstatuss,:citty; if (useerca.ssqlcodde=20000) bbreak; printf(%8s %8s %8d %88s n,sno,snamee,stattus,ciity); /* Deleete thhe firrst reecord that be feetchedd */ printf( upddate ccurrennt ?(00/1); scanf(%d,&i); if (i=1) printff(inpput s

45、nno=); scanf(%s,ssno); printf(ninnput ssname=); scanf(%s,ssname); printf(ninnput sstatuss=); scanf(%d,&statuus); printf(ninnput ccity=); scanf(%s,ccity); EXEC SQQL UPDDATE SS_TESTT SET sno=:sno,ssname=:snamme,staatus=:statuus,citty=:ciity WHERE CCURRENNT of cursoor1; EXEC SQQL COMMMIT; EXEC SQQL CLO

46、OSE cuursor11; EXEC SQQL COMMMIT; EXEC SQQL DISSCONNEECT; 1.4 第四章 提交/回滚事务 本章定义一事务务或叫逻辑工工作单元.为为了保证数据据库的一致性性,在ESQQL程序中,程序开发人人员可以控制制事务是否提提交或回滚.一事务通常常可以理解为为一个完整程程序对数据库库进行的所有有操作.一个个事务也可以以理解为是一一个逻 辑工工作单元. 1.4.1 逻辑工作单元 一个逻辑工作单单元是一组SSQL语句和和插入的主语语言码的集合合.COBAASE把它们们作为一个整整体来处理. 在逻辑工作单元元这一级上,COBASSE保证了数数据的一致性性,

47、这就意味味着要么完成成所有的操作作,要么每条条语句都不执执行. 如果在处理一个个逻辑工作单单元期间出现现了系统或用用户程序失败败,那么COOBASE就就自动把数据据恢复到该逻逻辑工作单元元开始之前的的状态,程序序失败时,CCOBASEE检测完错误误就恢复数据据,若系统故故障,COBBASE在重重新启动时恢恢复数据. 当遇 到第一个个可执行的SSQL语句(除了CONNNECT)时,就隐含含着一个逻辑辑工作单元的的开始,COOMMIT 和ROLLLBACK语语句结束一个个逻辑工作单单元.在ESSQL程序中中,说明语句句并不开始一一个逻辑单元元. COMMIT语语句保证了当当前逻辑单元元上的所有操操

48、作都完整地地提交给了数数据库.ROOLLBACCK语句取消消对当逻辑工工作单元所作作的操作 ,把数据库恢恢复到当前逻逻辑工作单元元开始前的状状态. 1.4.2 COMMIT 语句 该语句结束当前前逻辑工作单单元,把在逻逻辑工作单元元期们的所有有变化提 交交给数据库 .其格式如如下: EXEC SQQL COMMMIT; 在程序结束之前前,应该明确确地结束它的的工作单元,否则,若程程序成功结束束后,COBBASE自动动提交所有的的变换,若程程序非正常结结束,就恢复复到最近 没没有提交的逻逻辑工作单元元. COMMIT语语句不影响主主变量的内容容 或主程序序的控制流. 每条DDL语句句的执行,自自

49、动发出COOMMIT操操作,这就是是说 ,DDDL语句跟在在DML语句句后面,那么么以前的DMML语句就自自动提交组数数据库.一个个DDL语句句结束当前逻逻辑工作单元元,释放该程程序拥有的所所有锁. 1.4.3 ROLLBACCK语 句 该语句将数据库库恢复到当前前逻辑工作单单元之前的状状态,结束当当前的逻辑工工作单元.该该语 句不影响主变量量的内容或主主程序的控制制流.其格式式如下: EXEC SQQL ROLLLBACKK; 1.4.4 DISCONNNECT 语语句 当应用程序不再再使用COBBASE数据据库时,应该该使用DISSCONNEECT语句释释放程序所有有与COBAASE数据库

50、库有关的资源源,并退出数数据库,脱离离COBASSE环境.其其格式如下: EXEC SQQL DISSCONNEECT; 1.5 第五章 错误检检测和恢复 本章我们介绍如如何使用USSERCA来来进行错误检检测和处理。 1.5.1 USERCA的的结构 USERCA是是ESQL程程序用来传送送执行信息的的结构,每执执行完一条执执行性SQLL语句, CCOBASEE都把执行信信息写入USSERCA中中,对于说明明性SQL语语句,则无执执行信息.谨谨慎的程序员员应该在每一一SQL语句句执行完成后后,检查USSERCA结结构中内容来来确信语句的的执行是否成成功,并根据据其中的信息息作适当的处处理.在

51、ESSQL中,UUSERCAA的结构如下下: typedeff struuct char caaid100; /* userrca IDD */ long caalen; /* usserca lengtth */ long sqqlcodee; /* sql ccode */ long sqqltypee; /* sql sstatemment ttype */ int sqllerrmllen; /* sqll erroor messsage lengtth */ char sqqlerrmmtext80; /* sqql errror meessagee textt */ int sql

52、lreturrnflagg; /* sql rreturnn flagg(def or daata) */ long sqqlpl; /* sqql proocess liness (perr fetcch st) */ long sqqlcomll; /* sql ccommunnicatiion liines (per ccom) */ long sqqltotaal; /* seleect_tootal_llines */ char sqqlwarnn7; /* sqql warrnningg flagg */ short ssqlstssave; /* sqql_staatemennt

53、_savve flaag */ user_coom_areea; struct user_com_aarea uusercaa; 该结构的各元素素的意义描述述如下: userca.caid 通讯区标识识. userca.calenn 通讯区长长度. userca.sqlcoode 记录录每一SQLL语句执行完完成情况.其其取值如下: 0 表示执行成成功. 2000 表示示没有返回行行或最后一行行已取完. userca.sqltyype SQQL语句的类类型. userca.sqlerrrmlenn 执行SQQL语句错误误 信息的长长度. userca.sqlerrrmtexxt 执行SSQL语

54、句错错误 信息的的正文. userca.sqlreeturnfflag userca.sqlpll userca.sqlcooml uaseca.sqltootal userca.sqlwaarn userca.sqlwaarn0 警告检查查位; userca.sqlwaarn1 返回值截截断警告; userca.sqlwaarn2 在集函数数中忽略空值值警告; userca.sqlwaarn3 SELEECT_LIIST 个数数与 INTTO 子句项项 个数不符的警告告; userca.sqlwaarn4 DML操操作涉及每一一行的警告; userca.sqlwaarn5 SQL语语句引起事务务回滚的警告告; userca.sqlwaarn6 DELEETE语句对对于FOR_UPDATTE的行操作作警告; userca.sqlsttsave 1.6 第六章 使用说说明书 Cobase支支持两种方式式对数据库中中的数据进行行访问交互方式和和嵌入C程序序(ESQLL)的方式。CCobasee采用的是CClientt/Serv

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!