《2022年2022年经典的esql教程 .pdf》由会员分享,可在线阅读,更多相关《2022年2022年经典的esql教程 .pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第一章 ESQL介绍本章对 ESQL 做一概括介绍 , 主要讨论怎么使用 ESQL 、ESQL 的基本的概念和定义、 ESQL 程序的各个部分和ESQL 程序中语句的类型 . SQL语言是非过程化语言 , 大部分语句的执行与其前面或后面的语句无关,而一些高级编程语言都是基于如循环, 条件等结构的过程化语言 , 尽管 SQL语言非常有力 , 但它却没有过程化能力 . 若把 SQL语言嵌入到过程化的编程语言中, 则利用这些结构 , 程序开发人员就能设计出更加灵活的应用系统, 具有 SQL语言和高级编程语言的良好特征, 它将比单独使用 SQL或 C语言具有更强的功能和灵活性. COBASE RDBM
2、S 提供两种工具在主语言中编程来存取COBASE 数据库中的数据 .即高级语言预编译程序接口(ESQL)和高级语言的函数调用接口(CCI). 目前这些工具仅支持 C语言. COBASE RDBMS 提供的 ESQL 工具把含有 SQL语句的 C程序转化为可存取和操纵 COBASE 数据库中数据的 C程序, 作为一编译器 ,ESQL把输入文件中的 EXEC SQL 语句在输出文件中转化为适当的CCI函数调用 . 输出文件则可以正常的C程序的方式被编译、连接和执行. 1.1 ESQL 中的基本概念 ESQL 中的基本概念主要有 : 1.嵌入的 SQL语句: 嵌入的 SQL 语句是指在应用程序中使用
3、的SQL 语句. 该应用程序称作宿主程序, 书写该程序的语言称作宿主语言. 嵌入的 SQL语句与交互式 SQL 语句在语法上没有太大的差别 , 只是嵌入式 SQL 语句在个别语句上有所扩充. 如嵌入式 SQL 中的SELECT 语句增加了 INTO子句, 以便与宿主语言变量打交道. 此外, 嵌入式 SQL为适合程序设计语言的要求, 还增加了许多语句 , 如游标的定义、打开和关闭语句等等. 2.执行性 SQL语句和说明性 SQL语句: 嵌入的 SQL语句主要有两种类型 : 执行性 SQL语句和说明性 SQL语句. 执行性 SQL语句可用来连接 COBASE, 定义、查询和操纵 COBASE 数据
4、库中的数据 , 每一执行性语句真正对数据库进行操作 , 执行完成后 , 在 USERCA 中存放执行信息 . 说明性语句用来说明通讯域和SQL语句中用到的变量 . 说明性语句不生成执行代码, 对 USERCA 不产生影响 . 3.事务: 事务是逻辑上相关的一组SQL语句.COBASE 把它们视作一个单元 . 为了保持数据库的一致性 , 一事务内的所有操作要么都做, 要么都不做 . 1.2 ESQL 程序的组成和运行在 ESQL 程序中嵌入的 SQL语句以 EXEC 作为起始标识 , 语句的结束以 ; 作为标识. 在嵌入的 SQL 语句可以使用主语言 ( 这时是 C语言) 的程序变量 ( 即主变
5、量 ),这时主变量名前加冒号 (:) 作为标志 , 以区别于字段名 . ESQL 程序包括两部分 : 程序首部和程序体 . 程序首部定义变量 , 为 ESQL 程序做准备 , 程序体包括各种 SQL语句来操纵 COBASE 数据库中的数据 . 编制并运行 ESQL 程序比单独使用纯 C语言多一个预编译过程 , 通常具有以下几个步骤 : 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - 1.编辑 ESQL 程序(可利用编辑软件如
6、: EDLIN, WS 等进行编辑 ). 程序保后缀为.ec. 2.使用 COBASE 的预编译器 ETE对 ESQL 源程序进行预处理 , 该编译器将源程序中嵌入的 SQL语言翻译成标准 C语言, 产生一个 C语言编译器能直接进行编译的文件 . 其文件的扩展名为 .cpp 。该 cpp 文件可以和普通的cpp 文件一样被放入一个工程中被 C+ 编译器编译,连接最后运行。对 COBASE 的预编译器的使用的详细说明见第六章. 第二章 ESQL 程序的基本结构 ESQL 程序由两部分组成 : 程序首部和程序体 . 2.1 程序首部每一个 ESQL 程序的开始 , 就是程序的首部 , 它包括以下三
7、部分 : 1.DECLARE 部分: 说明特殊的主变量 , 这些变量区别于纯C语言程序中的变量 ,COBASE 使用这些变量与程序之间相互作用. 2.INCLUDE USERCA 语句: 说明一个 SQL语句的通讯域 (USERCA), 它提供了错误处理 , 其功能等价于代替C语言中的 #INCLUDE 语句. 3.CONNECT语句: 建立程序与 COBASE 之间的连接 . 2.1.1DECLARE 部分:( 描述部分 ) 在 DECLARE SECTION (描述部分 ), 定义所有在 SQL语句中用到的主变量 , 定义部分是以 : EXEC SQL BEGIN DECLARE SECT
8、ION; 和 EXEC SQL END DECLARE SECTION; 开始和结束的 . 在这两个语句中 , 只可以定义 SQL 语句中用到的主变量 , 每个预编译单元只允许一个 BEGIN/END DECLARE SECTION (描述部分 ), 但是一个程序可以包含许多独立的预编译单元。 若一个主变量或指示变量在ESQL 程序中的 SQL语句中引用 ,但它没有在描述部分中定义, 则程序在预编译时就会出现错误信息. 在这两个语句中可以定义的变量有六种类型:INT,SHORT,CHAR,FLOAT,NUMBER,DATE.其中 CHAR 型允许定义二维数组 , 其它类型只允许定义一维数组,
9、不允许有指针类型 , 在此处变量可以赋值 . 例如: EXEC SQL BEGIN DECLARE SECTION; int sno; char sname11; short snameid; EXEC SQL END DECLARE SECTION; (1)主变量 : 就是用在 SQL语句中的主语言变量 . 主要用于程序变量和数据库内部交换数据之用 , 它们的数据类型必须是在主语言中描述部分里定义过的, 而且它们的数据类型必须和 COBASE 数据库中已定义的表中的数据类型相匹配. 例如: 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - -
10、- - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - - - - - - SELECT 姓名, 等级 FROM 供应商 INTO :sname, :status WHERE 供应商号 =:sno; 该语句表示 , 从供应商表中在供应商号与主变量sno 一致的地方选择供应商姓名和供应商等级 ,COBASE 把结果传送到主变量sname,status 中. 主变量使用规则 : 1.必须在描述部分明确定义 . 2.必须使用与其定义相同的大小写格式. 3.在SQL 语句中使用主变量时必须在主变量前写一个冒号:,在纯 C语言语句中则不要在主变量前写冒号. 4.不
11、能是 SQL命令的保留字. 5.在一条语句中只能使用一次. 2.1.2 SQL 通讯域每个 COBASE 应用程序必须提供对错误的处理, 为了说明 SQL通讯域(USERCA), 必须在每个 COBASE 预编译程序中写上 : EXEC SQL INCLUDE USERCA; USERCA 是一结构 , 每一嵌入的执行性SQL语言的执行情况在其执行完成后写入 USERCA 结构中的各变量中 , 根据 USERCA 中的内容可以获得每一嵌入SQL语句执行后的信息 , 编制程序时就可以做适当的处理. 对其的详细说明见第五章. 2.1.3 连接 COBASE 在存取 COBASE 数据之前 , 每一
12、个预编译程序必须与COBASE 连接. 连接时 , 程序必须提供用户名和口令, 由 COBASE 进行校验 , 若口令和用户名正确 , 方可登录COBASE, 获得使用权 , 否则,COBASE 拒绝登录 , 则程序就不能使用数据库 . 缺省的用户名为“ cobase”,口令为“ cobase”。连接 COBASE 的格式如下 : EXEC SQL CONNECT :. CONNECT语句必须是 ESQL 程序中第一条可执行的SQL语句. 2.2 程序体程序体可以包含许多 SQL 语句, 以查询或处理存储在COBASE数据库中的数据 . 在应用程序中所包含的SQL语句, 可以查询或操纵存储在C
13、OBASE 中的数据 ,这些语句叫做数据操纵语言 (DML),应用程序体也可以包含DDL语句, 用来建立或定义数据结构, 如表、视图或索引 . 在用户程序中写入的任何有效的SQL语句都可以被执行,只需要把完整的 SQL语句按嵌入式的要求写入C语言的合适位置即可 . 嵌入在 C语言中的 SQL语句以 EXEC SQL 开始, 以; 为结束标志 .SQL语句中可以嵌入主变量, 主变量前应有 : 标志. 如下面例子都是嵌入式 SQL语句: EXEC SQL UPDATE 供应商 SET 姓名= 李 红 WHERE 供应商号 =S1; 名师资料总结 - - -精品资料欢迎下载 - - - - - -
14、- - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - EXEC SQL INSERT INTO 供应商 (供应商号 , 姓名, 等级, 城市) VALUES(:sno,:sname,:status,:city); EXEC SQL DELETE FROM 供应商 WHERE 等级 IS NULL; 从上面例可以看出 , 静态的增 , 删, 改语句与交互方式没有太大的差别, 对于查询语句就没有那么简单 , 查询语句在下一章中介绍. 现用几个例题程序加以说明. 例题程序 1 (建立一表并向表中插入数据
15、) EXEC SQL BEGIN DECLARE SECTION ; CHAR sno10,sname10,city10; INT status; EXEC SQL END DECLARE SECTION ; EXEC SQL INCLUDE USERCA; main() int i; EXEC SQL CONNECT cobase:cobase ; EXEC SQL CREATE TABLE S_TEST (SNO CHAR (9), SNAME CHAR (20), STATUS INT ,CITY CHAR(10); printf( create table success,insert
16、?); printf( 0 - no ); printf( 1 - yes ); printf( choice:); scanf(%d,&i); while(i) printf(input sno:); scanf(%s,sno); printf(input sname:); scanf(%s,sname); printf(input status:); scanf(%d,&status); printf(input city:); scanf(%s,city); EXEC SQL INSERT INTO S_TEST(SNO,SNAME,STATUS,CITY) VALUES (:sno,:
17、sname,:status,:city); printf(continue?); printf( 0 -terminate ); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - - printf( 1 -continue ); printf( choice:); scanf(%d,&i); EXEC SQL COMMIT; EXEC SQL DISCONNECT; exit(0); 例题程序 2 (修改和删除表中的数据 ) EXE
18、C SQL BEGIN DECLARE SECTION ; CHAR sno10,sname10,city10; INT status; EXEC SQL END DECLARE SECTION ; EXEC SQL INCLUDE USERCA; main() int i; printf(Now exec connect .); EXEC SQL CONNECT COBASE:COBASE ; printf( update?); printf( 0 - no ); printf( 1 - yes ); printf( choice:); scanf(%d,&i); while(i) prin
19、tf(input sno:); scanf(%s,sno); printf(input sname:); scanf(%s,sname); printf(input status:); scanf(%d,&status); printf(input city:); scanf(%s,city); EXEC SQL UPDATE S_TEST SET sname=:sname,city=:city ,status=:status WHERE sno=:sno; printf( continue?); printf( 0 -no ); printf( 1 -yes ); printf( choic
20、e:); scanf(%d,&i); printf( delete?); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 12 页 - - - - - - - - - printf( 0 - no ); printf( 1 - yes ); printf( choice:); scanf(%d,&i); while(i) printf(input sno:); scanf(%s,sno); EXEC SQL DELETE FROM S_TEST WHERE sno=:sn
21、o; printf( continue?); printf( 0 -no ); printf( 1 -yes ); printf( chioce:); scanf(%d,&i); EXEC SQL COMMIT; EXEC SQL DISCONNECT; exit(0); 第三章 查询在 ESQL 程序中 , 查询可以分为两大类型 : 返回一行的查询和返回多行的查询.对于查询 , 我们不仅对其执行得成功与否感兴趣, 其结果更为有用 . 多行查询要用到游标的概念 , 本章就介绍查询语句和游标的概念和使用. 3.1 SELECT 语句SELECT 语句是用于完成查询功能的SQL语句, 查询语句因为
22、有返回的结果, 故ESQL 中的 SELECT 语句比 SQL的 SELECT 语句多一 INTO子句,INTO 子句的主变量表对应于程序中主变量 , 用于存放查询返回的结果. SELECT 语句格式如下 : EXEC SQL SELECT ,. INTO FROM ,. WHERE ; 其中:1. 检索条件中允许有主变量和嵌套子查询语句. 2.INTO后的主变量可以是数组 . 3.主变量前要用 : 标志. 执行该语句时 ,COBASE 找出表中满足检索条件的行, 并把结果传送到 INTO子句中所对应的主变量中 . 该语句的查询结果可以是一行或多行.WHERE 后的主变量叫输入主变量 , 它提
23、供了查询所需的信息 .INTO 子句中的主变量叫输出主变量, 它保存 SELECT 语句运行后的结果 . 例题程序 3 ( 返回一行的查询 ) EXEC SQL BEGIN DECLARE SECTION ; INT status; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 12 页 - - - - - - - - - CHAR sno10,sname10,city10,isno10; EXEC SQL END DECLARE SECTION ; EXEC SQL
24、INCLUDE USERCA; main() EXEC SQL CONNECT cobase:cobase ; printf(input the sno for update:); scanf(%s,sno); EXEC SQL SELECT sno,sname,status,city INTO :sno , :sname ,:status,:city from S_TEST WHERE sno=:sno; printf(sno: %s ;,sno); printf(sname: %s ;,sname); printf(status: %d ;,status); printf(city: %s
25、 ;,city); EXEC SQL COMMIT; EXEC SQL DISCONNECT; exit(0); 例题程序 4 ( 返回多行的查询 ) EXEC SQL BEGIN DECLARE SECTION ; INT status10; CHAR sno1010,sname1015,city1020,isno10; EXEC SQL END DECLARE SECTION ; EXEC SQL INCLUDE USERCA; main() int i; EXEC SQL CONNECT cobase:cobase ; for(i=0;i10;i+) strcpy(snoi,ttttt)
26、; strcpy(snamei,ttttt); strcpy(cityi,ttttt); statusi=1000; EXEC SQL SELECT sno,sname,status,city INTO :sno , :sname ,:status,:city from S_TEST; printf(sno sname status city); for(i=0;i10;i+) printf(%8s %8s %8d %8s ,snoi,snamei,statusi,cityi); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - -
27、名师精心整理 - - - - - - - 第 7 页,共 12 页 - - - - - - - - - getchar(); EXEC SQL COMMIT; EXEC SQL DISCONNECT; 3.2 游标的使用我们知道 SQL语言是一种面向集合的语言, 而普通的高级语言则是面向记录的语言 , 要想使 SQL 语言能与宿主语言通讯 ,ESQL提供了游标操作 , 能把 SQL的集合操作结果 , 按单个记录方式取出 , 赋于主变量进行进一步的处理. 如果查询结果返回多行或不知返回多少行, 就可使用带游标的 SELECT 语句.一个游标 (CURSOR) 是一个 COBASE 和 ESQL
28、使用的工作区域 ,COBASE 使用这个工作区存放着一个查询结果 . 一个已命名的游标是和一条SELECT 语句相关联 . 一个游标必须首先定义 (同一个查询相关联 ), 然后用三条可运行的SQL语句使用游标 ,以操纵数据 . 四条操纵游标的命令如下 : .DECLRE CURSOR .OPEN CURSOR .FETCH .CLOSE CURSOR DECLARE CURSOR 语句用来定义一游标 , 此时游标处于关闭状态 . 用 OPEN CURSOR语句打开游标后 , 就可用它从相关的查询中取出多于一行的结果. 所有满足查询条件的行组成一个集合, 叫做游标活动集 . 通过 FETCH 取
29、操作 , 活动集中的每一行可以一个一个的返回, 当查询作完后 , 游标就可以用 CLOSE CURSOR 语句关闭. 3.2.1DECLARE CURSOR 定义游标语句 : ESQL 中的 DECLARE CURSOR语句定义游标 , 赋给它一个与查询相关的游标名.该语句的格式为 : EXEC SQL DECLARE CURSOR FOR FOR UPDATE; 其中:(1)SELECT语句应不含 INTO子句. (2)若无 FOR UPDATE 则无法 执行 UPDATE( 定位) 和 DELETE( 定位)语句. 定义游标的 DECLARE 语句必须出现在程序中对游标进行操作的所有语句之
30、前, ESQL 不能引用没有说明的游标 , 游标的定义范围是整个程序. 程序中可包含多个 DECLARE 语句, 这些语句定义了不同的游标, 并把游标与不同的查询联系在一起, 所以在同一个程序中的两个DECLARE 语句中不能说明同一个游标名. 3.2.2 OPEN CURSOR 打开游标语句 ESQL中 OPEN CURSOR语句格式如下 : EXEC SQL OPEN ; OPEN 语句决定了满足查询的行的集合, 游标处于打开状态 , 它的活动集就是满足 WHERE 子句条件的行的集合 . 这时, 游标处在活动集的第一行的前面. 名师资料总结 - - -精品资料欢迎下载 - - - - -
31、 - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 12 页 - - - - - - - - - 3.2.3 FETCH CURSOR 语句 ESQL中的 FETCH CURSOR 语句读出活动集中的行 , 并把结果送到输出主变量,输出主变量是在相关的FETCH 语句中定义的 . 其格式如下 : EXEC SQL FETCH INTO ; 游标必须先定义 , 然后再打开 , 只有当游标处于打开状态时, 才执行 FETCH语句. 在第一次运行 FETCH 时, 游标从活动集的第一行前移到当前第一行, 使这一行成为当前行 . 每次运行 F
32、ETCH 时游标在活动集中向前移 , 把选出的结果送到主变量表中指定的输出主变量中. 如果游标活动集中是空的 , 或所有的行已经被取走 ,COBASE 就返回一代码.(USERCA.SQLCODE=2000). 游标只可在活动集中向前移动,COBASE 无法取到已经用 FETCH 取过的行 , 要想再取这一行 , 就必须关闭游标 , 再重新打开它 . 3.2.4 CLOSE CURSOR 关闭游标语句当取完活动集中所有行后, 必须关闭游标 , 以释放与该游标的关的资源. 其格式如下 : EXEC SQL CLOSE ; 例题程序 5 (使用游标的查询 ) EXEC SQL BEGIN DECL
33、ARE SECTION ; INT status; CHAR sno10,sname15,city20; EXEC SQL END DECLARE SECTION ; EXEC SQL INCLUDE USERCA; main() int i; printf(Now exec connect .); EXEC SQL CONNECT cobase:cobase ; printf(Now exec declare_open_fetch_close cursor .); EXEC SQL DECLARE cursor1 CURSOR FOR SELECT * FROM S_TEST; EXEC S
34、QL OPEN cursor1 ; printf(sno sname status cityn ); do EXEC SQL FETCH cursor1 INTO :sno,:sname,:status,:city ; If (userca.sqlcode=2000) break; printf(%8s %8s %8d %8s n,sno,sname,status,city); getchar(); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 12 页 - - - -
35、 - - - - - while(1); EXEC SQL CLOSE cursor1 ; EXEC SQL COMMIT; EXEC SQL DISCONNECT; 3.3 定位修改和删除语句 COBASE 支持 SQL格式 CURRENT OF CURSOR.这条语句将指向一个游标中最新取出的行 , 以用于修改和删除操作 . 该语句必须在取操作之后使用 , 它等同于存储一个 ROWID, 并使用它 . 其格式如下 : (1) EXEC SQL UPDATE SET = | NULL , = | NULL . WHERE CURRENT OF ; (2) EXEC SQL UPDATE SE
36、T ( ) = ( ) WHERE CURRENT OF ; (3) EXEC SQL DELETE FROM WHERE CURRENT OF ; 这些语句执行在游标名的当前行下更新或修改. 其中在值表达式或子查询中出现的主变量前应有 : 标志. 例题程序 6 (定位删除 ) EXEC SQL BEGIN DECLARE SECTION ; INT status; CHAR sno10,sname15,city20; EXEC SQL END DECLARE SECTION ; EXEC SQL INCLUDE USERCA; main() int i; printf(Now exec co
37、nnect .); EXEC SQL CONNECT COBASE:COBASE ; printf(Now exec declare cursor .); EXEC SQL DECLARE cursor1 CURSOR FOR SELECT sno,sname,status,city FROM S_TEST FOR UPDATE; printf(Now exec open cursor .); EXEC SQL OPEN cursor1; printf(sno sname status cityn); for(;) printf(Now exec fetch cursor .n); 名师资料总
38、结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 12 页 - - - - - - - - - EXEC SQL FETCH cursor1 INTO :sno,:sname,:status,:city; if (userca.sqlcode=2000) break; printf(%8s %8s %8d %8s n,sno,sname,status,city); /Delete the first record that be fetched printf( delete cur
39、rent ?(0/1); scanf(%d,&i); if (i=1) EXEC SQL DELETE FROM S_TEST WHERE CURRENT of cursor1; EXEC SQL CLOSE cursor1; EXEC SQL COMMIT; EXEC SQL DISCONNECT; 例题程序 7 (定位修改 ) EXEC SQL BEGIN DECLARE SECTION ; INT status; CHAR sno10,sname15,city20; EXEC SQL END DECLARE SECTION ; EXEC SQL INCLUDE USERCA; main(
40、) int i; strcpy(sno,ttttt); strcpy(sname,ttttt); strcpy(city,ttttt); status=1000; EXEC SQL CONNECT cobase:cobase ; EXEC SQL DECLARE cursor1 CURSOR FOR SELECT SNO, SNAME, STATUS,CITY FROM S_TEST FOR UPDATE; EXEC SQL OPEN cursor1; printf(sno sname status cityn); for(;) EXEC SQL FETCH cursor1 INTO :sno
41、,:sname,:status,:city; if (userca.sqlcode=2000) break; printf(%8s %8s %8d %8s n,sno,sname,status,city); printf( update current ?(0/1); scanf(%d,&i); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 12 页 - - - - - - - - - if (i=1) printf(input sno=); scanf(%s,sno
42、); printf(ninput sname=); scanf(%s,sname); printf(ninput status=); scanf(%d,&status); printf(ninput city=); scanf(%s,city); EXEC SQL UPDATE S_TEST SET sno=:sno,sname=:sname,status=:status,city=:city WHERE CURRENT of cursor1; EXEC SQL COMMIT; EXEC SQL CLOSE cursor1; EXEC SQL COMMIT; EXEC SQL DISCONNECT; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 12 页 - - - - - - - - -