数据库系统概论:第8章 数据库编程

上传人:新** 文档编号:568840511 上传时间:2024-07-27 格式:PPT 页数:139 大小:662KB
返回 下载 相关 举报
数据库系统概论:第8章 数据库编程_第1页
第1页 / 共139页
数据库系统概论:第8章 数据库编程_第2页
第2页 / 共139页
数据库系统概论:第8章 数据库编程_第3页
第3页 / 共139页
数据库系统概论:第8章 数据库编程_第4页
第4页 / 共139页
数据库系统概论:第8章 数据库编程_第5页
第5页 / 共139页
点击查看更多>>
资源描述

《数据库系统概论:第8章 数据库编程》由会员分享,可在线阅读,更多相关《数据库系统概论:第8章 数据库编程(139页珍藏版)》请在金锄头文库上搜索。

1、An Introduction to Database System数据库系统概论An Introduction to Database System第八章第八章 数据库编程数据库编程An Introduction to Database System第八章第八章 数据库编程数据库编程8.1 嵌入式嵌入式SQL8.2 过程化过程化SQL8.3 存储过程和函数存储过程和函数8.4 ODBC编程编程*8.5 OLE DB*8.6 JDBC编程编程8.7 小结小结An Introduction to Database System8.1 嵌入式嵌入式SQLvSQL语言提供了两种不同的使用方式语言提供

2、了两种不同的使用方式n交互式交互式n嵌入式嵌入式v为什么要引入嵌入式为什么要引入嵌入式SQLnSQL语言是非过程性语言语言是非过程性语言n事务处理应用需要高级语言事务处理应用需要高级语言v这两种方式细节上有差别,在程序设计的环境下,这两种方式细节上有差别,在程序设计的环境下,SQL语句要做某些必要的扩充语句要做某些必要的扩充An Introduction to Database System8.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的处理过程的处理过程8.1.2 嵌入式嵌入式SQL语句与主语言之间的通信语句与主语言之间的通信8.1.3 不用游标的不用游标的SQL语句语句8.1.4

3、 使用游标的使用游标的SQL语句语句8.1.5 动态动态SQLAn Introduction to Database System8.1.1 嵌入式嵌入式SQL的处理过程的处理过程v主语言主语言n嵌入式嵌入式SQL是将是将SQL语句嵌入程序设计语言中,被嵌入语句嵌入程序设计语言中,被嵌入的程序设计语言,如的程序设计语言,如C、C+、Java,称为宿主语言,简,称为宿主语言,简称主语言。称主语言。v处理过程处理过程n预编译方法预编译方法An Introduction to Database System嵌入式嵌入式SQL的处理过程(续)的处理过程(续) 关系数据库管理系统预处关系数据库管理系统预

4、处理程序转换嵌入式理程序转换嵌入式SQL语语句为函数调用句为函数调用含嵌入式含嵌入式SQL语句语句的主语言程序的主语言程序转换后的转换后的主语言程序主语言程序主语言编译程序主语言编译程序编译处理编译处理目标语言程序目标语言程序An Introduction to Database System嵌入式嵌入式SQL的处理过程(续)的处理过程(续) v为了区分为了区分SQL语句与主语言语句,所有语句与主语言语句,所有SQL语句语句必须加前缀必须加前缀EXEC SQL, 主语言为主语言为C语言时,语句格式:语言时,语句格式:nEXEC SQL ;An Introduction to Database

5、System8.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的处理过程的处理过程8.1.2 嵌入式嵌入式SQL语句与主语言之间的通信语句与主语言之间的通信8.1.3 不用游标的不用游标的SQL语句语句8.1.4 使用游标的使用游标的SQL语句语句8.1.5 动态动态SQLAn Introduction to Database System8.1.2 嵌入式嵌入式SQL语句与主语言之间的通信语句与主语言之间的通信v将将SQL嵌入到高级语言中混合编程,程序中会含嵌入到高级语言中混合编程,程序中会含有两种不同计算模型的语句有两种不同计算模型的语句nSQL语句语句l 描述性的面向集合的语句描述

6、性的面向集合的语句l 负责操纵数据库负责操纵数据库n高级语言语句高级语言语句l 过程性的面向记录的语句过程性的面向记录的语句l 负责控制逻辑流程负责控制逻辑流程n它们之间应该如何通信?它们之间应该如何通信?An Introduction to Database System嵌入式嵌入式SQL语句与主语言之间的通信(续)语句与主语言之间的通信(续) v数据库工作单元与源程序工作单元之间的通信数据库工作单元与源程序工作单元之间的通信(1)向主语言传递)向主语言传递SQL语句的执行状态信息,使主语言语句的执行状态信息,使主语言能够据此控制程序流程,主要用能够据此控制程序流程,主要用SQL通信区实现通

7、信区实现(2)主语言向)主语言向SQL语句提供参数,主要用主变量实现语句提供参数,主要用主变量实现(3)将)将SQL语句查询数据库的结果交主语言处理,主要语句查询数据库的结果交主语言处理,主要用主变量和游标实现用主变量和游标实现An Introduction to Database System1. SQL通信区通信区vSQLCA: SQL Communication AreanSQLCA是一个数据结构是一个数据结构vSQLCA的用途的用途nSQL语句执行后,系统反馈给应用程序信息语句执行后,系统反馈给应用程序信息l 描述系统当前工作状态描述系统当前工作状态l 描述运行环境描述运行环境n这些信

8、息将送到这些信息将送到SQL通信区中通信区中n应用程序从应用程序从SQL通信区中取出这些状态信息,据此决通信区中取出这些状态信息,据此决定接下来执行的语句定接下来执行的语句An Introduction to Database SystemSQL通信区(续)通信区(续)vSQLCA使用方法使用方法n定义定义SQLCAl 用用EXEC SQL INCLUDE SQLCA定义定义n使用使用SQLCAlSQLCA中有一个存放每次执行中有一个存放每次执行SQL语句后返回代码的变语句后返回代码的变量量SQLCODEl如果如果SQLCODE等于预定义的常量等于预定义的常量SUCCESS,则表示,则表示SQ

9、L语句成功,否则表示出错语句成功,否则表示出错l应用程序每执行完一条应用程序每执行完一条SQL 语句之后都应该测试一下语句之后都应该测试一下SQLCODE的值,以了解该的值,以了解该SQL语句执行情况并做相应语句执行情况并做相应处理处理An Introduction to Database System2. 主变量主变量 v主变量主变量n嵌入式嵌入式SQL语句中可以使用主语言的程序变量来输入语句中可以使用主语言的程序变量来输入或输出数据或输出数据n在在SQL语句中使用的主语言程序变量简称为主变量语句中使用的主语言程序变量简称为主变量(Host Variable)An Introduction

10、to Database System主变量(续)主变量(续) v主变量的类型主变量的类型n输入主变量输入主变量l由应用程序对其赋值,由应用程序对其赋值,SQL语句引用语句引用n输出主变量输出主变量l由由SQL语句对其赋值或设置状态信息,返回给应用程序语句对其赋值或设置状态信息,返回给应用程序An Introduction to Database System主变量(续)主变量(续) v指示变量指示变量n是一个整型变量,用来是一个整型变量,用来“指示指示”所指主变量的值或条件所指主变量的值或条件n一个主变量可以附带一个指示变量(一个主变量可以附带一个指示变量(Indicator Variable

11、)n指示变量的用途指示变量的用途l指示输入主变量是否为空值指示输入主变量是否为空值l检测输出变量是否为空值,值是否被截断检测输出变量是否为空值,值是否被截断An Introduction to Database System主变量(续)主变量(续) v在在SQL语句中使用主变量和指示变量的方法语句中使用主变量和指示变量的方法n说明主变量和指示变量说明主变量和指示变量BEGIN DECLARE SECTION. (说明主变量和指示变量)(说明主变量和指示变量).END DECLARE SECTIONAn Introduction to Database System主变量(续)主变量(续) v在

12、在SQL语句中使用主变量和指示变量的方法(续)语句中使用主变量和指示变量的方法(续)n使用主变量使用主变量l说明之后的主变量可以在说明之后的主变量可以在SQL语句中任何一个能够使用表语句中任何一个能够使用表达式的地方出现达式的地方出现l为了与数据库对象名(表名、视图名、列名等)区别,为了与数据库对象名(表名、视图名、列名等)区别,SQL语句中的主变量名前要加冒号(语句中的主变量名前要加冒号(:)作为标志)作为标志n使用指示变量使用指示变量l 指示变量前也必须加冒号标志指示变量前也必须加冒号标志l 必须紧跟在所指主变量之后必须紧跟在所指主变量之后An Introduction to Databa

13、se System主变量(续)主变量(续) v在在SQL语句之外(主语言语句中)使用主变量和语句之外(主语言语句中)使用主变量和指示变量的方法指示变量的方法n可以直接引用,不必加冒号可以直接引用,不必加冒号An Introduction to Database System3. 游标游标v为什么要使用游标为什么要使用游标nSQL语言与主语言具有不同数据处理方式语言与主语言具有不同数据处理方式nSQL语言是面向集合的,一条语言是面向集合的,一条SQL语句原则上可以产语句原则上可以产生或处理多条记录生或处理多条记录n主语言是面向记录的,一组主变量一次只能存放一条主语言是面向记录的,一组主变量一次只

14、能存放一条记录记录n仅使用主变量并不能完全满足仅使用主变量并不能完全满足SQL语句向应用程序输语句向应用程序输出数据的要求出数据的要求n嵌入式嵌入式SQL引入了游标的概念,用来协调这两种不同引入了游标的概念,用来协调这两种不同的处理方式的处理方式An Introduction to Database System 游标(续)游标(续)v游标游标n游标是系统为用户开设的一个数据缓冲区,存放游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果语句的执行结果n每个游标区都有一个名字每个游标区都有一个名字n用户可以用用户可以用SQL语句逐一从游标中获取记录,并赋给语句逐一从游标中获取记录,并

15、赋给主变量,交由主语言进一步处理主变量,交由主语言进一步处理An Introduction to Database System4. 建立和关闭数据库连接建立和关闭数据库连接(1)建立数据库连接)建立数据库连接 EXEC SQL CONNECT TO targetAS connection-nameUSER user-name; ntarget是要连接的数据库服务器是要连接的数据库服务器l常见的服务器标识串,如常见的服务器标识串,如: l包含服务器标识的包含服务器标识的SQL串常量串常量 lDEFAULT An Introduction to Database System建立和关闭数据库连接

16、(续)建立和关闭数据库连接(续)nconnect-name是可选的连接名,连接名必须是一个是可选的连接名,连接名必须是一个有效的标识符有效的标识符 n在整个程序内只有一个连接时可以不指定连接名在整个程序内只有一个连接时可以不指定连接名n程序运行过程中可以修改当前连接程序运行过程中可以修改当前连接 EXEC SQL SET CONNECTION connection-name |DEFAULT;An Introduction to Database System建立和关闭数据库连接(续)建立和关闭数据库连接(续)(2)关闭数据库连接)关闭数据库连接 EXEC SQL DISCONNECT con

17、nection;An Introduction to Database System5. 程序实例程序实例v例例8.1 依次检查某个系的学生记录,交互式更新依次检查某个系的学生记录,交互式更新某些学生年龄。某些学生年龄。EXEC SQL BEGIN DECLARE SECTION; /*主变量说明开始主变量说明开始*/ char Deptname20;char Hsno9;char Hsname20; char Hssex2;int HSage;int NEWAGE;EXEC SQL END DECLARE SECTION; /*主变量说明结束主变量说明结束*/long SQLCODE;EXE

18、C SQL INCLUDE SQLCA; /*定义定义SQL通信区通信区*/An Introduction to Database System程序实例(续)程序实例(续)int main(void) /*C语言主程序开始语言主程序开始*/int count = 0;char yn; /*变量变量yn代表代表yes或或no*/printf(Please choose the department name(CS/MA/IS): ); scanf(%s,deptname); /*为主变量为主变量deptname赋值赋值*/EXEC SQL CONNECT TO TESTlocalhost:543

19、21 USER SYSTEM/MANAGER; /*连接数据库连接数据库TEST*/EXEC SQL DECLARE SX CURSOR FOR /*定义游标定义游标SX*/SELECT Sno,Sname,Ssex,Sage /*SX对应的语句对应的语句*/FROM StudentWHERE SDept = :deptname;EXEC SQL OPEN SX; /*打开游标打开游标SX,指向查询结果的第一行,指向查询结果的第一行*/An Introduction to Database System程序实例(续)程序实例(续)for ( ; ; ) /*用循环结构逐条处理结果集中的记录用循

20、环结构逐条处理结果集中的记录*/ EXEC SQL FETCH SX INTO :HSno,:Hsname,:HSsex,:HSage; /*推进游标,将当前数据放入主变量推进游标,将当前数据放入主变量*/if (SQLCA.SQLCODE!= 0) /*SQLCODE != 0,表示操作不成功,表示操作不成功*/break; /*利用利用SQLCA中的状态信息决定何时退出循环中的状态信息决定何时退出循环*/if(count+ = 0) /*如果是第一行的话,先打出行头如果是第一行的话,先打出行头*/ printf(n%-10s %-20s %-10s %-10sn, Sno“,Sname“,

21、Ssex, Sage);printf(%-10s %-20s %-10s %-10dn“, HSno,Hsname,Hssex,HSage); /*打印查询结果打印查询结果*/ printf(“UPDATE AGE(y/n)?”); /*询问用户是否要更新该学生的年龄询问用户是否要更新该学生的年龄*/ doscanf(%c,&yn); while(yn != N & yn != n & yn != Y & yn != y);An Introduction to Database System程序实例(续)程序实例(续) if (yn = y | yn = Y) /*如果选择更新操作如果选择更新

22、操作*/ printf(INPUT NEW AGE:); scanf(%d,&NEWAGE); /*用户输入新年龄到主变量中用户输入新年龄到主变量中*/ EXEC SQL UPDATE Student /*嵌入式嵌入式SQL更新语句更新语句*/ SET Sage = :NEWAGE WHERE CURRENT OF SX; /*对当前游标指向的学生年龄进行更新对当前游标指向的学生年龄进行更新*/ EXEC SQL CLOSE SX; /*关闭游标关闭游标SX,不再和查询结果对应,不再和查询结果对应*/ EXEC SQL COMMIT WORK; /*提交更新提交更新*/ EXEC SQL DI

23、SCONNECT TEST; /*断开数据库连接断开数据库连接*/An Introduction to Database System8.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的处理过程的处理过程8.1.2 嵌入式嵌入式SQL语句与主语言之间的通信语句与主语言之间的通信8.1.3 不用游标的不用游标的SQL语句语句8.1.4 使用游标的使用游标的SQL语句语句8.1.5 动态动态SQLAn Introduction to Database System8.1.3 不用游标的不用游标的SQL语句语句v不用游标的不用游标的SQL语句的种类语句的种类n 说明性语句说明性语句n 数据定义

24、语句数据定义语句n 数据控制语句数据控制语句n 查询结果为单记录的查询结果为单记录的SELECT语句语句n 非非CURRENT形式的增删改语句形式的增删改语句 An Introduction to Database System不用游标的不用游标的SQL语句(续)语句(续)1. 查询结果为单记录的查询结果为单记录的SELECT语句语句 2. 非非CURRENT形式的增删改语句形式的增删改语句An Introduction to Database System1. 查询结果为单记录的查询结果为单记录的SELECT语句语句v这类语句不需要使用游标,只需用这类语句不需要使用游标,只需用INTO子句指

25、定子句指定存放查询结果的主变量。存放查询结果的主变量。 v例例8.2 根据学生号码查询学生信息。根据学生号码查询学生信息。EXEC SQL SELECT Sno,Sname,Ssex,Sage,Sdept INTO:Hsno,:Hname,:Hsex,:Hage,:Hdept FROM Student WHERE Sno=:givensno; /*把要查询的学生的学号赋给为了主变量把要查询的学生的学号赋给为了主变量givensno*/An Introduction to Database System查询结果为单记录的查询结果为单记录的SELECT语句(续)语句(续)vINTO子句、子句、WH

26、ERE子句和子句和HAVING短语的条件短语的条件表达式中均可以使用主变量表达式中均可以使用主变量v查询返回的记录中,可能某些列为空值查询返回的记录中,可能某些列为空值NULLv 如果查询结果实际上并不是单条记录,而是多如果查询结果实际上并不是单条记录,而是多条记录,则程序出错,关系数据库管理系统会在条记录,则程序出错,关系数据库管理系统会在SQLCA中返回错误信息中返回错误信息 An Introduction to Database System查询结果为单记录的查询结果为单记录的SELECT语句(续)语句(续)v例例8.3 查询某个学生选修某门课程的成绩。假设查询某个学生选修某门课程的成绩

27、。假设已经把将要查询的学生的学号赋给了主变量已经把将要查询的学生的学号赋给了主变量givensno,将课程号赋给了主变量,将课程号赋给了主变量givencno。EXEC SQL SELECT Sno,Cno,Grade INTO :Hsno,:Hcno,:Hgrade:Gradeid /*指示变量指示变量Gradeid*/ FROM SC WHERE Sno=:givensno AND Cno=:givencno;如果如果Gradeid 0,不论,不论Hgrade为何值,均认为该学生成为何值,均认为该学生成绩为空值。绩为空值。An Introduction to Database System

28、2. 非非CURRENT形式的增删改语句形式的增删改语句v在在UPDATE的的SET子句和子句和WHERE子句中可以使用子句中可以使用主变量,主变量,SET子句还可以使用指示变量子句还可以使用指示变量 v例例8.4 修改某个学生选修修改某个学生选修1号课程的成绩。号课程的成绩。EXEC SQL UPDATE SC SET Grade=:newgrade /*修改的成绩已赋给主变量:修改的成绩已赋给主变量:newgrade*/ WHERE Sno=:givensno;/*学号赋给主变量:学号赋给主变量:givensno*/An Introduction to Database System非非C

29、URRENT形式的增删改语句(续)形式的增删改语句(续)v例例8.5 某个学生新选修了某门课程,将有关记录某个学生新选修了某门课程,将有关记录插入插入SC表中。假设插入的学号已赋给主变量表中。假设插入的学号已赋给主变量stdno,课程号已赋给主变量,课程号已赋给主变量couno。gradeid=-1; /*gradeid为指示变量,赋为负值为指示变量,赋为负值*/EXEC SQL INSERT INTO SC(Sno,Cno,Grade) VALUES(:stdno,:couno,:gr :gradeid); /*:stdno,:couno,:gr为主变量为主变量*/ 由于该学生刚选修课程,成

30、绩应为空,所以要把指示变量由于该学生刚选修课程,成绩应为空,所以要把指示变量赋为负值赋为负值An Introduction to Database System8.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的处理过程的处理过程8.1.2 嵌入式嵌入式SQL语句与主语言之间的通信语句与主语言之间的通信8.1.3 不用游标的不用游标的SQL语句语句8.1.4 使用游标的使用游标的SQL语句语句8.1.5 动态动态SQLAn Introduction to Database System8.1.4 使用游标的使用游标的SQL语句语句v必须使用游标的必须使用游标的SQL语句语句n查询结果为多

31、条记录的查询结果为多条记录的SELECT语句语句nCURRENT形式的形式的UPDATE语句语句nCURRENT形式的形式的DELETE语句语句An Introduction to Database System使用游标的使用游标的SQL语句(续)语句(续)1. 查询结果为多条记录的查询结果为多条记录的SELECT语句语句2. CURRENT形式的形式的UPDATE和和DELETE语句语句An Introduction to Database System1. 查询结果为多条记录的查询结果为多条记录的SELECT语句语句v使用游标的步骤使用游标的步骤(1)说明游标)说明游标(2)打开游标)打开

32、游标(3)推进游标指针并取当前记录)推进游标指针并取当前记录 (4)关闭游标)关闭游标An Introduction to Database System(1)说明游标)说明游标v使用使用DECLARE语句语句v语句格式语句格式EXEC SQL DECLARE CURSOR FOR ;v功能功能n是一条说明性语句,这时关系数据库管理系统并不执行是一条说明性语句,这时关系数据库管理系统并不执行SELECT语句语句An Introduction to Database System(2)打开游标)打开游标v使用使用OPEN语句语句v语句格式语句格式 EXEC SQL OPEN ;v功能功能n打开游

33、标实际上是执行相应的打开游标实际上是执行相应的SELECT语句,把查询结语句,把查询结果取到缓冲区中果取到缓冲区中n这时游标处于活动状态,指针指向查询结果集中的第一这时游标处于活动状态,指针指向查询结果集中的第一条记录条记录An Introduction to Database System(3)推进游标指针并取当前记录)推进游标指针并取当前记录 v使用使用FETCH语句语句v语句格式语句格式 EXEC SQL FETCH INTO ,.;v功能功能n指定方向推动游标指针,同时将缓冲区中的当前记录取指定方向推动游标指针,同时将缓冲区中的当前记录取出来送至主变量供主语言进一步处理出来送至主变量供

34、主语言进一步处理An Introduction to Database System(4)关闭游标)关闭游标v使用使用CLOSE语句语句v语句格式语句格式 EXEC SQL CLOSE ;v功能功能n关闭游标,释放结果集占用的缓冲区及其他资源关闭游标,释放结果集占用的缓冲区及其他资源v说明说明n游标被关闭后,就不再和原来的查询结果集相联系游标被关闭后,就不再和原来的查询结果集相联系n被关闭的游标可以再次被打开,与新的查询结果相联系被关闭的游标可以再次被打开,与新的查询结果相联系An Introduction to Database System2. CURRENT形式的形式的UPDATE语句和

35、语句和DELETE语句语句vCURRENT形式的形式的UPDATE语句和语句和DELETE语句语句的用途的用途n非非CURRENT形式的形式的UPDATE语句和语句和DELETE语句语句l面向集合的操作面向集合的操作l一次修改或删除所有满足条件的记录一次修改或删除所有满足条件的记录An Introduction to Database SystemCURRENT形式的形式的UPDATE语句和语句和DELETE语句(续)语句(续)vCURRENT形式的形式的UPDATE语句和语句和DELETE语句语句的用途(续)的用途(续)n如果只想修改或删除其中某个记录如果只想修改或删除其中某个记录l用带游标

36、的用带游标的SELECT语句查出所有满足条件的记录语句查出所有满足条件的记录l从中进一步找出要修改或删除的记录从中进一步找出要修改或删除的记录l用用CURRENT形式的形式的UPDATE语句和语句和DELETE语句修改语句修改或删除之或删除之lUPDATE语句和语句和DELETE语句中要用子句语句中要用子句WHERE CURRENT OF 表示修改或删除的是最近一次取出的记录,即游标指针表示修改或删除的是最近一次取出的记录,即游标指针指向的记录指向的记录 An Introduction to Database SystemCURRENT形式的形式的UPDATE语句和语句和DELETE语句(续)

37、语句(续)v不能使用不能使用CURRENT形式的形式的UPDATE语句和语句和DELETE语句语句n当游标定义中的当游标定义中的SELECT语句带有语句带有UNION或或ORDER BY子句子句 n该该SELECT语句相当于定义了一个不可更新的视图语句相当于定义了一个不可更新的视图 An Introduction to Database System8.1 嵌入式嵌入式SQL8.1.1 嵌入式嵌入式SQL的处理过程的处理过程8.1.2 嵌入式嵌入式SQL语句与主语言之间的通信语句与主语言之间的通信8.1.3 不用游标的不用游标的SQL语句语句8.1.4 使用游标的使用游标的SQL语句语句8.1

38、.5 动态动态SQLAn Introduction to Database System 8.1.5 动态动态SQLv静态嵌入式静态嵌入式SQLn静态嵌入式静态嵌入式SQL语句能够满足一般要求语句能够满足一般要求 n无法满足要到执行时才能够确定要提交的无法满足要到执行时才能够确定要提交的SQL语句、语句、查询的条件查询的条件 v动态嵌入式动态嵌入式SQLn允许在程序运行过程中临时允许在程序运行过程中临时“组装组装”SQL语句语句n支持动态组装支持动态组装SQL语句和动态参数两种形式语句和动态参数两种形式 An Introduction to Database System动态动态SQL(续)(

39、续)1. 使用使用SQL语句主变量语句主变量 2. 动态参数动态参数3. 执行准备好的语句(执行准备好的语句(EXECUTE)An Introduction to Database System1. 使用使用SQL语句主变量语句主变量vSQL语句主变量语句主变量n程序主变量包含的内容是程序主变量包含的内容是SQL语句的内容,而不是原语句的内容,而不是原来保存数据的输入或输出变量来保存数据的输入或输出变量nSQL语句主变量在程序执行期间可以设定不同的语句主变量在程序执行期间可以设定不同的SQL语句,然后立即执行语句,然后立即执行 An Introduction to Database Syste

40、m使用使用SQL语句主变量(续)语句主变量(续)v例例8.6 创建基本表创建基本表TEST。EXEC SQL BEGIN DECLARE SECTION; const char *stmt=CREATE TABLE test(a int); /*SQL语句主变量,内容是创建表的语句主变量,内容是创建表的SQL语句语句*/EXEC SQL END DECLARE SECTION; . EXEC SQL EXECUTE IMMEDIATE :stmt; /*执行动态执行动态SQL语句语句*/An Introduction to Database System2. 动态参数动态参数v动态参数动态参数

41、nSQL语句中的可变元素语句中的可变元素n使用参数符号(使用参数符号(?)表示该位置的数据在运行时设定)表示该位置的数据在运行时设定v和主变量的区别和主变量的区别n动态参数的输入不是编译时完成绑定动态参数的输入不是编译时完成绑定n而是通过而是通过 PREPARE语句准备主变量和执行语句语句准备主变量和执行语句EXECUTE绑定数据或主变量来完成绑定数据或主变量来完成 An Introduction to Database System动态参数(续)动态参数(续)v使用动态参数的步骤使用动态参数的步骤(1)声明)声明SQL语句主变量语句主变量(2)准备)准备SQL语句(语句(PREPARE)EX

42、EC SQL PREPARE FROM ; An Introduction to Database System3. 执行准备好的语句(执行准备好的语句(EXECUTE)vEXEC SQL EXECUTE INTO USING ; An Introduction to Database System执行准备好的语句(执行准备好的语句(EXECUTE)(续)(续)v例例8.7 向向TEST中插入元组。中插入元组。EXEC SQL BEGIN DECLARE SECTION;const char *stmt = INSERT INTO test VALUES(?); /*声明声明SQL主变量内容是

43、主变量内容是INSERT语句语句 */EXEC SQL END DECLARE SECTION;. EXEC SQL PREPARE mystmt FROM :stmt; /*准备语句准备语句*/. EXEC SQL EXECUTE mystmt USING 100; /*执行语句,设定执行语句,设定INSERT语句插入值语句插入值100 */EXEC SQL EXECUTE mystmt USING 200; /* 执行语句,设定执行语句,设定INSERT语句插入值语句插入值200 */An Introduction to Database System第八章第八章 数据库编程数据库编程8.

44、1 嵌入式嵌入式SQL8.2 过程化过程化SQL8.3 存储过程和函数存储过程和函数8.4 ODBC编程编程*8.5 OLE DB*8.6 JDBC编程编程8.7 小结小结An Introduction to Database System8.2 过程化过程化SQL8.2.1 过程化过程化SQL的块结构的块结构8.2.2 变量和常量的定义变量和常量的定义8.2.3 流程控制流程控制An Introduction to Database System8.2.1 过程化过程化SQL的块结构的块结构v过程化过程化SQL nSQL的扩展的扩展 n增加了过程化语句功能增加了过程化语句功能 n基本结构是块

45、基本结构是块l块之间可以互相嵌套块之间可以互相嵌套 l每个块完成一个逻辑操作每个块完成一个逻辑操作 An Introduction to Database System过程化过程化SQL的块结构(续)的块结构(续)v过程化过程化SQL块的基本结构块的基本结构1. 定义部分定义部分 DECLARE 变量、常量、游标、异常等变量、常量、游标、异常等 l定义的变量、常量等只能在该基本块中使用定义的变量、常量等只能在该基本块中使用l当基本块执行结束时,定义就不再存在当基本块执行结束时,定义就不再存在An Introduction to Database System过程化过程化SQL的块结构(续)的块

46、结构(续)v过程化过程化SQL块的基本结构(续)块的基本结构(续)2. 执行部分执行部分 BEGIN SQL语句、过程化语句、过程化SQL的流程控制语句的流程控制语句 EXCEPTION 异常处理部分异常处理部分 END;An Introduction to Database System8.2 过程化过程化SQL8.2.1 过程化过程化SQL的块结构的块结构8.2.2 变量和常量的定义变量和常量的定义8.2.3 流程控制流程控制An Introduction to Database System8.2.2 变量和常量的定义变量和常量的定义1. 变量定义变量定义n变量名变量名 数据类型数据类型

47、 NOT NULL:=初值表达式初值表达式或或n变量名变量名 数据类型数据类型 NOT NULL 初值表达式初值表达式2. 常量定义常量定义n常量名常量名 数据类型数据类型 CONSTANT :=常量表达式常量表达式n常量必须要给一个值,并且该值在存在期间或常量的常量必须要给一个值,并且该值在存在期间或常量的作用域内不能改变。如果试图修改它,过程化作用域内不能改变。如果试图修改它,过程化SQL将将返回一个异常返回一个异常3. 赋值语句赋值语句n变量名称变量名称 :=表达式表达式An Introduction to Database System8.2 过程化过程化SQL8.2.1 过程化过程化

48、SQL的块结构的块结构8.2.2 变量和常量的定义变量和常量的定义8.2.3 流程控制流程控制An Introduction to Database System8.2.3 流程控制流程控制v过程化过程化SQL功能功能1. 条件控制语句条件控制语句2. 循环控制语句循环控制语句 3. 错误处理错误处理 An Introduction to Database System流程控制(续)流程控制(续)1. 条件控制语句条件控制语句 IF-THEN,IF-THEN-ELSE和嵌套的和嵌套的IF语句语句 (1)IF condition THEN Sequence_of_statements; END

49、IF; (2)IF condition THEN Sequence_of_statements1; ELSE Sequence_of_statements2; END IF;(3)在)在THEN和和ELSE子句中还可以再包含子句中还可以再包含IF语句,即语句,即IF语句可以嵌套语句可以嵌套 An Introduction to Database System流程控制(续)流程控制(续)2. 循环控制语句循环控制语句 LOOP,WHILE-LOOP和和FOR-LOOP (1)简单的循环语句)简单的循环语句LOOP LOOP Sequence_of_statements; END LOOP; 多数

50、数据库服务器的过程化多数数据库服务器的过程化SQL都提供都提供EXIT、BREAK或或 LEAVE等循环结束语句,保证等循环结束语句,保证LOOP语句块能够结束语句块能够结束An Introduction to Database System流程控制(续)流程控制(续)2. 循环控制语句(续)循环控制语句(续)(2)WHILE-LOOP WHILE condition LOOP Sequence_of_statements; END LOOP;l每次执行循环体语句之前,首先对条件进行求值每次执行循环体语句之前,首先对条件进行求值l如果条件为真,则执行循环体内的语句序列如果条件为真,则执行循环体

51、内的语句序列l如果条件为假,则跳过循环并把控制传递给下一个语句如果条件为假,则跳过循环并把控制传递给下一个语句 An Introduction to Database System流程控制(续)流程控制(续)2. 循环控制语句(续)循环控制语句(续)(3)FOR-LOOP FOR count IN REVERSE bound1 bound2 LOOP Sequence_of_statements; END LOOP;An Introduction to Database System流程控制(续)流程控制(续)3. 错误处理错误处理n如果过程化如果过程化SQL在执行时出现异常,则应该让程序在在

52、执行时出现异常,则应该让程序在产生异常的语句处停下来,根据异常的类型去执行异产生异常的语句处停下来,根据异常的类型去执行异常处理语句常处理语句 nSQL标准对数据库服务器提供什么样的异常处理做出标准对数据库服务器提供什么样的异常处理做出了建议,要求过程化了建议,要求过程化SQL管理器提供完善的异常处理管理器提供完善的异常处理机制机制 An Introduction to Database System第八章第八章 数据库编程数据库编程8.1 嵌入式嵌入式SQL8.2 过程化过程化SQL8.3 存储过程和函数存储过程和函数8.4 ODBC编程编程*8.5 OLE DB*8.6 JDBC编程编程8

53、.7 小结小结An Introduction to Database System8.3 存储过程和函数存储过程和函数8.3.1 存储过程存储过程8.3.2 函数函数*8.3.3 过程化过程化SQL中的游标中的游标An Introduction to Database System8.3.1 存储过程存储过程v过程化过程化SQL块类型块类型n命名块命名块l编译后保存在数据库中,可以被反复调用,运行速度较编译后保存在数据库中,可以被反复调用,运行速度较快,过程和函数是命名块快,过程和函数是命名块 n匿名块匿名块l每次执行时都要进行编译,它不能被存储到数据库中,每次执行时都要进行编译,它不能被存储

54、到数据库中,也不能在其他过程化也不能在其他过程化SQL块中调用块中调用 An Introduction to Database System存储过程(续)存储过程(续)1. 存储过程的优点存储过程的优点 2. 存储过程的用户接口存储过程的用户接口 An Introduction to Database System存储过程(续)存储过程(续)v存储过程:由过程化存储过程:由过程化SQL语句书写的过程,经编语句书写的过程,经编译和优化后存储在数据库服务器中,使用时只要译和优化后存储在数据库服务器中,使用时只要调用即可。调用即可。v存储过程的优点存储过程的优点(1)运行效率高)运行效率高(2)降低

55、了客户机和服务器之间的通信量)降低了客户机和服务器之间的通信量(3)方便实施企业规则)方便实施企业规则An Introduction to Database System存储过程(续)存储过程(续)v存储过程的用户接口存储过程的用户接口(1)创建存储过程)创建存储过程 (2)执行存储过程)执行存储过程 (3)修改存储过程)修改存储过程(4)删除存储过程)删除存储过程 An Introduction to Database System2. 存储过程的用户接口存储过程的用户接口(1)创建存储过程)创建存储过程CREATE OR REPLACE PROCEDURE 过程名过程名(参数参数1,参数参

56、数2,.) AS ;n过程名:数据库服务器合法的对象标识过程名:数据库服务器合法的对象标识n参数列表:用名字来标识调用时给出的参数值,必须参数列表:用名字来标识调用时给出的参数值,必须指定值的数据类型。参数也可以定义输入参数、输出指定值的数据类型。参数也可以定义输入参数、输出参数或输入参数或输入/输出参数,默认为输入参数输出参数,默认为输入参数n过程体:是一个过程体:是一个,包括声明部分和可,包括声明部分和可执行语句部分执行语句部分 An Introduction to Database System存储过程的用户接口(续)存储过程的用户接口(续)v例例8.8 利用存储过程来实现下面的应用:从

57、账户利用存储过程来实现下面的应用:从账户1转指定数转指定数额的款项到账户额的款项到账户2中。中。CREATE OR REPLACE PROCEDURE TRANSFER(inAccount INT,outAccount INT,amount FLOAT) /*定义存储过程定义存储过程TRANSFER,其参数为转入账户、转出账户、转账额度,其参数为转入账户、转出账户、转账额度*/AS DECLARE/*定义变量定义变量*/ totalDepositOut Float; totalDepositIn Float;inAccountnum INT; An Introduction to Databa

58、se System存储过程的用户接口(续)存储过程的用户接口(续) BEGIN /*检查转出账户的余额检查转出账户的余额 */ SELECT Total INTO totalDepositOut FROM Accout WHERE accountnum=outAccount; IF totalDepositOut IS NULL THEN /*如果转出账户不存在或账户中没有存款如果转出账户不存在或账户中没有存款*/ ROLLBACK; /*回滚事务回滚事务*/ RETURN; END IF; An Introduction to Database System存储过程的用户接口(续)存储过程的

59、用户接口(续)IF totalDeposit Out amount THEN /*如果账户存款不足如果账户存款不足*/ROLLBACK; /*回滚事务回滚事务*/RETURN;END IF;SELECT Accountnum INTO inAccountnum FROM AccountWHERE accountnum=inAccount;IF inAccount IS NULL THEN /*如果转入账户不存在如果转入账户不存在*/ ROLLBACK; /*回滚事务回滚事务*/RETURN;ENDIF;An Introduction to Database System存储过程的用户接口(续)

60、存储过程的用户接口(续)UPDATE Account SET total=total-amount WHERE accountnum=outAccount; /* 修改转出账户余额,减去转出额修改转出账户余额,减去转出额 */UPDATE Account SET total=total + amount WHERE accountnum=inAccount; /* 修改转入账户余额,增加转入额修改转入账户余额,增加转入额 */COMMIT; /* 提交转账事务提交转账事务 */END;An Introduction to Database System存储过程的用户接口(续)存储过程的用户接口

61、(续)(2)执行存储过程)执行存储过程 CALL/PERFORM PROCEDURE 过程名过程名(参数参数1,参数参数2,.);n使用使用CALL或者或者PERFORM等方式激活存储过程的执行等方式激活存储过程的执行n在过程化在过程化SQL中,数据库服务器支持在过程体中调用其他存中,数据库服务器支持在过程体中调用其他存储过程储过程An Introduction to Database System存储过程的用户接口(续)存储过程的用户接口(续)v例例8.9 从账户从账户01003815868转转10000元到元到01003813828账户中。账户中。 CALL PROCEDURE TRANS

62、FER(01003813828,01003815868,10000);An Introduction to Database System存储过程的用户接口(续)存储过程的用户接口(续)(3)修改存储过程)修改存储过程 ALTER PROCEDURE 过程名过程名1 RENAME TO 过程名过程名2;(4)删除存储过程删除存储过程 DROP PROCEDURE 过程名过程名();An Introduction to Database System8.3 存储过程和函数存储过程和函数8.3.1 存储过程存储过程8.3.2 函数函数*8.3.3 过程化过程化SQL中的游标中的游标An Intro

63、duction to Database System8.3.2 函数函数v函数和存储过程的异同函数和存储过程的异同n同:都是持久性存储模块同:都是持久性存储模块n异:函数必须指定返回的类型异:函数必须指定返回的类型An Introduction to Database System函数(续)函数(续)1. 函数的定义语句格式函数的定义语句格式CREATE OR REPLACE FUNCTION 函数名函数名 (参数参数1,参参数数2,) RETURNS AS ;2. 函数的执行语句格式函数的执行语句格式CALL/SELECT 函数名函数名 (参数参数1,参数参数2,);3. 修改函数修改函数n

64、重命名重命名ALTER FUNCTION 过程名过程名1 RENAME TO 过程名过程名2;n重新编译重新编译ALTER FUNCTION 过程名过程名 COMPILE;An Introduction to Database System第八章第八章 数据库编程数据库编程8.1 嵌入式嵌入式SQL8.2 过程化过程化SQL8.3 存储过程和函数存储过程和函数8.4 ODBC编程编程*8.5 OLE DB*8.6 JDBC编程编程8.7 小结小结An Introduction to Database System8.4 ODBC编程编程vODBC优点优点n移植性好移植性好n能同时访问不同的数据

65、库能同时访问不同的数据库n共享多个数据资源共享多个数据资源 An Introduction to Database System8.4 ODBC编程编程8.4.1 ODBC概述概述8.4.2 ODBC工作原理概述工作原理概述 8.4.3 ODBC API 基础基础 8.4.4 ODBC的工作流程的工作流程An Introduction to Database System8.4.1 ODBC概述概述vODBC产生的原因产生的原因n由于不同的数据库管理系统的存在,在某个关系数据由于不同的数据库管理系统的存在,在某个关系数据库管理系统下编写的应用程序就不能在另一个关系数库管理系统下编写的应用程序就

66、不能在另一个关系数据库管理系统下运行据库管理系统下运行 n许多应用程序需要共享多个部门的数据资源,访问不许多应用程序需要共享多个部门的数据资源,访问不同的关系数据库管理系统同的关系数据库管理系统An Introduction to Database SystemODBC概述(续)概述(续)vODBCn是微软公司开放服务体系(是微软公司开放服务体系(Windows Open Services Architecture,WOSA)中有关数据库的一个组成部分)中有关数据库的一个组成部分 n提供了一组访问数据库的应用程序编程接口提供了一组访问数据库的应用程序编程接口(Application Progr

67、amming Interface,API )vODBC约束力约束力n规范应用开发规范应用开发n规范关系数据库管理系统应用接口规范关系数据库管理系统应用接口An Introduction to Database System8.4 ODBC编程编程8.4.1 ODBC概述概述8.4.2 ODBC工作原理概述工作原理概述 8.4.3 ODBC API 基础基础 8.4.4 ODBC的工作流程的工作流程An Introduction to Database System8.4.2 ODBC工作原理概述工作原理概述vODBC应用系统的体系结构应用系统的体系结构 1. 用户应用程序用户应用程序 2. O

68、DBC驱动程序管理器驱动程序管理器 3. 数据库驱动程序数据库驱动程序4. 数据源数据源An Introduction to Database SystemODBC工作原理概述(续)工作原理概述(续)数据源数据源KingbaseES数据源数据源Oracle数据源数据源SQL Server用户应用程序用户应用程序ODBC应用程序编程接口应用程序编程接口ODBC驱动程序管理器驱动程序管理器数据库数据库驱动程序驱动程序2数据库数据库驱动程序驱动程序1数据库数据库驱动程序驱动程序3网络网络图图8.3 ODBC应用系统的体系结构应用系统的体系结构An Introduction to Database S

69、ystem1. 用户应用程序用户应用程序vODBC应用程序包括的内容应用程序包括的内容n请求连接数据库请求连接数据库n向数据源发送向数据源发送SQL语句语句n为为SQL语句执行结果分配存储空间,定义所读取的数语句执行结果分配存储空间,定义所读取的数据格式据格式n获取数据库操作结果或处理错误获取数据库操作结果或处理错误n进行数据处理并向用户提交处理结果进行数据处理并向用户提交处理结果n请求事务的提交和回滚操作请求事务的提交和回滚操作n断开与数据源的连接断开与数据源的连接An Introduction to Database System2. ODBC驱动程序管理器驱动程序管理器 v驱动程序管理器

70、:用来管理各种驱动程序驱动程序管理器:用来管理各种驱动程序 n包含在包含在ODBC32.DLL中中 n管理应用程序和驱动程序之间的通信管理应用程序和驱动程序之间的通信 n建立、配置或删除数据源,并查看系统当前所安装的建立、配置或删除数据源,并查看系统当前所安装的数据库数据库ODBC驱动程序驱动程序An Introduction to Database SystemODBC驱动程序管理器(续)驱动程序管理器(续) v主要功能:主要功能:l装载装载ODBC驱动程序驱动程序l选择和连接正确的驱动程序选择和连接正确的驱动程序l管理数据源管理数据源l检查检查ODBC调用参数的合法性调用参数的合法性l记录

71、记录ODBC函数的调用等函数的调用等An Introduction to Database System3. 数据库驱动程序数据库驱动程序vODBC通过驱动程序来提供应用系统与数据库平通过驱动程序来提供应用系统与数据库平台的独立性台的独立性 vODBC应用程序不能直接存取数据库应用程序不能直接存取数据库n其各种操作请求由驱动程序管理器提交给某个关系数其各种操作请求由驱动程序管理器提交给某个关系数据库管理系统的据库管理系统的ODBC驱动程序驱动程序n通过调用驱动程序所支持的函数来存取数据库通过调用驱动程序所支持的函数来存取数据库n数据库的操作结果也通过驱动程序返回给应用程序数据库的操作结果也通过

72、驱动程序返回给应用程序n如果应用程序要操纵不同的数据库,就要动态地链接如果应用程序要操纵不同的数据库,就要动态地链接到不同的驱动程序上到不同的驱动程序上An Introduction to Database System数据库驱动程序(续)数据库驱动程序(续)vODBC驱动程序类型驱动程序类型n单束单束l数据源和应用程序在同一台机器上数据源和应用程序在同一台机器上l驱动程序直接完成对数据文件的驱动程序直接完成对数据文件的I/O操作操作l驱动程序相当于数据管理器驱动程序相当于数据管理器 n多束多束 l支持客户机支持客户机服务器、客户机服务器、客户机应用服务器应用服务器/数据库服务数据库服务器等网

73、络环境下的数据访问器等网络环境下的数据访问l由驱动程序完成数据库访问请求的提交和结果集接收由驱动程序完成数据库访问请求的提交和结果集接收l应用程序使用驱动程序提供的结果集管理接口操纵执行应用程序使用驱动程序提供的结果集管理接口操纵执行后的结果数据后的结果数据 An Introduction to Database System4. ODBC数据源管理数据源管理 v数据源:是最终用户需要访问的数据,包含了数数据源:是最终用户需要访问的数据,包含了数据库位置和数据库类型等信息,是一种数据连接据库位置和数据库类型等信息,是一种数据连接的抽象的抽象An Introduction to Database

74、 SystemODBC数据源管理数据源管理 (续)(续)v数据源对最终用户是透明的数据源对最终用户是透明的 nODBC给每个被访问的数据源指定唯一的数据源名给每个被访问的数据源指定唯一的数据源名(Data Source Name,简称,简称DSN),并映射到所),并映射到所有必要的、用来存取数据的低层软件有必要的、用来存取数据的低层软件n在连接中,用数据源名来代表用户名、服务器名、在连接中,用数据源名来代表用户名、服务器名、所连接的数据库名等所连接的数据库名等n最终用户无须知道数据库管理系统或其他数据管理最终用户无须知道数据库管理系统或其他数据管理软件、网络以及有关软件、网络以及有关ODBC驱

75、动程序的细节驱动程序的细节An Introduction to Database SystemODBC数据源管理(续)数据源管理(续)v例如,假设某个学校在例如,假设某个学校在SQL Server和和KingbaseES上创建了两个数据库:学校人事数上创建了两个数据库:学校人事数据库和教学科研数据库。据库和教学科研数据库。n学校的信息系统要从这两个数据库中存取数据学校的信息系统要从这两个数据库中存取数据n为了方便地与两个数据库连接,为学校人事数据库创为了方便地与两个数据库连接,为学校人事数据库创建一个数据源名建一个数据源名PERSON,为教学科研数据库创建一,为教学科研数据库创建一个名为个名为

76、EDU的数据源的数据源n当要访问每一个数据库时,只要与当要访问每一个数据库时,只要与PERSON和和EDU连连接即可,不需要记住使用的驱动程序、服务器名称、接即可,不需要记住使用的驱动程序、服务器名称、数据库名数据库名 An Introduction to Database System8.4 ODBC编程编程8.4.1 ODBC概述概述8.4.2 ODBC工作原理概述工作原理概述 8.4.3 ODBC API 基础基础 8.4.4 ODBC的工作流程的工作流程An Introduction to Database System8.4.3 ODBC API 基础基础vODBC 应用程序编程接口

77、的一致性应用程序编程接口的一致性 nAPI一致性一致性l包含核心级、扩展包含核心级、扩展1级、扩展级、扩展2级级n语法一致性语法一致性l包含最低限度包含最低限度SQL语法级、核心语法级、核心SQL语法级、扩展语法级、扩展SQL语法级语法级 An Introduction to Database SystemODBC API 基础(续)基础(续)1. 函数概述函数概述2. 句柄及其属性句柄及其属性3. 数据类型数据类型An Introduction to Database System1. 函数概述函数概述vODBC 3.0 标准提供了标准提供了76个函数接口个函数接口n分配和释放环境句柄、连接

78、句柄、语句句柄分配和释放环境句柄、连接句柄、语句句柄n连接函数(连接函数(SQLDriverconnect等)等)n与信息相关的函数(与信息相关的函数(SQLGetinfo、SQLGetFuction等)等)n事务处理函数(如事务处理函数(如SQLEndTran)n执行相关函数(执行相关函数(SQLExecdirect、SQLExecute等)等)n编目函数,编目函数,ODBC 3.0提供了提供了11个编目函数,如个编目函数,如SQLTables、SQLColumn等。应用程序可以通过对编目等。应用程序可以通过对编目函数的调用来获取数据字典的信息,如权限、表结构等函数的调用来获取数据字典的信息

79、,如权限、表结构等 An Introduction to Database System函数概述(续)函数概述(续)vODBC不同版本上的函数和函数使用是有差异的,不同版本上的函数和函数使用是有差异的,读者必须注意使用的版本,目前最新的版本是读者必须注意使用的版本,目前最新的版本是ODBC 3.8An Introduction to Database System2. 句柄及其属性句柄及其属性v句柄是句柄是32位整数值,代表一个指针位整数值,代表一个指针 vODBC 3.0中句柄分类中句柄分类n环境句柄环境句柄n连接句柄连接句柄n语句句柄语句句柄n描述符句柄描述符句柄 An Introduct

80、ion to Database System句柄及其属性(续)句柄及其属性(续)v应用程序句柄之间的关系应用程序句柄之间的关系n每个每个ODBC应用程序需要建立一个应用程序需要建立一个ODBC环境,分配一环境,分配一个环境句柄,存取数据的全局性背景,如环境状态、当个环境句柄,存取数据的全局性背景,如环境状态、当前环境状态诊断、当前在环境上分配的连接句柄等前环境状态诊断、当前在环境上分配的连接句柄等n一个环境句柄可以建立多个连接句柄,每一个连接句柄一个环境句柄可以建立多个连接句柄,每一个连接句柄实现与一个数据源之间的连接实现与一个数据源之间的连接An Introduction to Databa

81、se System句柄及其属性(续)句柄及其属性(续)ODBC应用程序应用程序环境句柄环境句柄连接句柄连接句柄语句句柄语句句柄数据源数据源描述符句柄描述符句柄111n1n111n图图8.4 应用程序句柄之间的关系应用程序句柄之间的关系An Introduction to Database System句柄及其属性(续)句柄及其属性(续)v应用程序句柄之间的关系(续)应用程序句柄之间的关系(续)n在一个连接中可以建立多个语句句柄,它不只是一个在一个连接中可以建立多个语句句柄,它不只是一个SQL语句,还包括语句,还包括SQL语句产生的结果集以及相关的语句产生的结果集以及相关的信息等信息等n在在OD

82、BC 3.0中又提出了描述符句柄的概念,它是描述中又提出了描述符句柄的概念,它是描述SQL语句的参数、结果集列的元数据集合语句的参数、结果集列的元数据集合An Introduction to Database System3. 数据类型数据类型 vODBC数据类型数据类型nSQL数据类型:用于数据源数据类型:用于数据源 nC数据类型数据类型 :用于应用程序的:用于应用程序的C代码代码 v应用程序可以通过应用程序可以通过SQLGetTypeInfo来获取不同来获取不同的驱动程序对于数据类型的支持情况的驱动程序对于数据类型的支持情况 An Introduction to Database Syst

83、em 数据类型(续)数据类型(续)vSQL数据类型和数据类型和C数据类型之间的转换规则数据类型之间的转换规则SQL数据类型数据类型C数据类型数据类型SQL数据类型数据类型数据源之间转换数据源之间转换应用程序变量传送到语句应用程序变量传送到语句参数参数(SQLBindparameter)C数据类型数据类型从结果集列中返回到应用从结果集列中返回到应用程序变量(程序变量(SQLBindcol)应用程序变量之间转换应用程序变量之间转换An Introduction to Database System8.4 ODBC编程编程8.4.1 ODBC概述概述8.4.2 ODBC工作原理概述工作原理概述 8.

84、4.3 ODBC API 基础基础 8.4.4 ODBC的工作流程的工作流程An Introduction to Database System8.4.4 ODBC的工作流程的工作流程vODBC的工作流程的工作流程An Introduction to Database SystemODBC的工作流程(续)的工作流程(续)v例例8.11 将将KingbaseES数据库中数据库中Student表的数表的数据备份到据备份到SQL Server数据库中。数据库中。n该应用涉及两个不同的关系数据库管理系统中的数据该应用涉及两个不同的关系数据库管理系统中的数据源源n使用使用ODBC来开发应用程序,只要改变

85、应用程序中连接来开发应用程序,只要改变应用程序中连接函数(函数(SQLConnect)的参数,就可以连接不同关系)的参数,就可以连接不同关系数据库管理系统的驱动程序,连接两个数据源数据库管理系统的驱动程序,连接两个数据源An Introduction to Database SystemODBC的工作流程(续)的工作流程(续)v在应用程序运行前,已经在在应用程序运行前,已经在KingbaseES和和SQL Server中分别建立了中分别建立了Student关系表关系表v应用程序要执行的操作应用程序要执行的操作n在在KingbaseES上执行上执行SELECT * FROM Student;n把

86、获取的结果集,通过多次执行把获取的结果集,通过多次执行INSERT语句插入到语句插入到SQL Server的的Student表中表中 An Introduction to Database SystemODBC的工作流程(续)的工作流程(续)v操作步骤操作步骤1. 配置数据源配置数据源2. 初始化环境初始化环境3. 建立连接建立连接 4. 分配语句句柄分配语句句柄5. 执行执行SQL语句语句6. 结果集处理结果集处理7. 中止处理中止处理An Introduction to Database System1. 配置数据源配置数据源v配置数据源有两种方法配置数据源有两种方法n运行数据源管理工具来

87、进行配置运行数据源管理工具来进行配置n使用使用Driver Manager 提供的提供的ConfigDsn函数来增加、修函数来增加、修改或删除数据源改或删除数据源v在在例例8.12中,采用第一种方法创建数据源。因为中,采用第一种方法创建数据源。因为要同时用到要同时用到KingbaseES和和SQL Server,所以分别,所以分别建立两个数据源,将其取名为建立两个数据源,将其取名为KingbaseES ODBC和和SQL Server An Introduction to Database System配置数据源(续)配置数据源(续)v例例8.12 创建数据源的详细过程创建数据源的详细过程 #

88、include #include #include #include #include #include #define SNO_LEN 30#define NAME_LEN 50#define DEPART_LEN 100#define SSEX_LEN 5An Introduction to Database System配置数据源(续)配置数据源(续)v创建数据源创建数据源-第一步:定义句柄和变量第一步:定义句柄和变量int main()/* Step 1 定义句柄和变量定义句柄和变量 */*以以king开头的表示的是连接开头的表示的是连接KingbaseES的变量的变量*/*以以ser

89、ver开头的表示的是连接开头的表示的是连接SQLServer的变量的变量*/SQLHENV kinghenv,serverhenv; /*环境句柄环境句柄*/SQLHDBC kinghdbc,serverhdbc; /*连接句柄连接句柄*/SQLHSTMT kinghstmt,serverhstmt; /*语句句柄语句句柄*/SQLRETURN ret;SQLCHAR sNameNAME_LEN,sDepartDEPART_LEN,sSexSSEX_LEN,sSnoSNO_LEN;SQLINTEGER sAge;SQLINTEGER cbAge=0,cbSno=SQL_NTS,cbSex=SQ

90、L_NTS,cbName=SQL_NTS,cbDepart=SQL_NTS;An Introduction to Database System2. 初始化环境初始化环境v没有和具体的驱动程序相关联,由没有和具体的驱动程序相关联,由Driver Manager来进行控制来进行控制 ,并配置环境属性,并配置环境属性 v应用程序通过调用连接函数和某个数据源进行连应用程序通过调用连接函数和某个数据源进行连接后,接后,Driver Manager才调用所连的驱动程序中才调用所连的驱动程序中的的SQLAllocHandle,来真正分配环境句柄的数,来真正分配环境句柄的数据结构据结构 An Introdu

91、ction to Database System初始化环境(续)初始化环境(续)v创建数据源创建数据源-第二步:初始化环境第二步:初始化环境 /* Step 2 初始化环境初始化环境 */ret=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE, &kinghenv);ret=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE, &serverhenv);ret=SQLSetEnvAttr(kinghenv,SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);ret=SQ

92、LSetEnvAttr(serverhenv,SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);An Introduction to Database System3. 建立连接建立连接 v应用程序调用应用程序调用SQLAllocHandle分配连接句柄,分配连接句柄,通过通过SQLConnect、SQLDriverConnect或或SQLBrowseConnect与数据源连接与数据源连接 vSQLConnect连接函数的输入参数为:连接函数的输入参数为:n配置好的数据源名称配置好的数据源名称n用户用户IDn口令口令 v例例8.12中中Kingbas

93、eES ODBC为数据源名字,为数据源名字,SYSTEM为用户名,为用户名,MANAGER为用户密码为用户密码 An Introduction to Database System建立连接(续)建立连接(续)v创建数据源创建数据源-第三步:建立连接第三步:建立连接/* Step 3 建立连接建立连接 */ret=SQLAllocHandle(SQL_HANDLE_DBC, kinghenv, &kinghdbc);ret=SQLAllocHandle(SQL_HANDLE_DBC, serverhenv, &serverhdbc);ret=SQLConnect(kinghdbc,“Kingba

94、seES ODBC”, SQL_NTS,“SYSTEM”,SQL_NTS, MANAGER,SQL_NTS);if (!SQL_SUCCEEDED(ret)/*连接失败时返回错误值连接失败时返回错误值*/return -1;ret=SQLConnect(serverhdbc, SQLServer, SQL_NTS, sa“,SQL_NTS,sa,SQL_NTS);if (!SQL_SUCCEEDED(ret) )/*连接失败时返回错误值连接失败时返回错误值*/return -1;An Introduction to Database System4. 分配语句句柄分配语句句柄v处理任何处理任何

95、SQL语句之前,应用程序还需要首先分语句之前,应用程序还需要首先分配一个语句句柄配一个语句句柄 v语句句柄含有具体的语句句柄含有具体的SQL语句以及输出的结果集语句以及输出的结果集等信息等信息 v应用程序还可以通过应用程序还可以通过SQLtStmtAttr来设置语句属来设置语句属性(也可以使用默认值)性(也可以使用默认值) An Introduction to Database System分配语句句柄(续)分配语句句柄(续)v创建数据源创建数据源-第四步第四步/* Step 4 初始化语句句柄初始化语句句柄 */ret=SQLAllocHandle(SQL_HANDLE_STMT,kingh

96、dbc,&kinghstmt);ret=SQLSetStmtAttr(kinghstmt,SQL_ATTR_ROW_BIND_TYPE, (SQLPOINTER) SQL_BIND_BY_COLUMN, SQL_IS_INTEGER);ret=SQLAllocHandle(SQL_HANDLE_STMT,serverhdbc, &serverhstmt);例例8.12中分配了两个语句句柄中分配了两个语句句柄l一个用来从一个用来从KingbaseES中读取数据产生结果集中读取数据产生结果集(kinghstmt)l一个用来向一个用来向SQL Server插入数据(插入数据(serverhstmt)

97、 例例8.12中结果集绑定的方式为按列绑定中结果集绑定的方式为按列绑定An Introduction to Database System5. 执行执行SQL语句语句v应用程序处理应用程序处理SQL语句的两种方式语句的两种方式n预处理(预处理(SQLPrepare、SQLExecute适用于语句的多适用于语句的多次执行)次执行)n直接执行(直接执行(SQLExecdirect) v如果如果SQL语句含有参数,应用程序为每个参数调语句含有参数,应用程序为每个参数调用用SQLBindParameter,并把它们绑定至应用程,并把它们绑定至应用程序变量序变量 v应用程序可以直接通过改变应用程序缓冲区

98、的内应用程序可以直接通过改变应用程序缓冲区的内容从而在程序中动态改变容从而在程序中动态改变SQL语句的具体执行语句的具体执行An Introduction to Database System执行执行SQL语句(续)语句(续)v应用程序根据语句类型进行的处理应用程序根据语句类型进行的处理n有结果集的语句(有结果集的语句(select或是编目函数),则进行结果集或是编目函数),则进行结果集处理处理n没有结果集的函数,可以直接利用本语句句柄继续执行没有结果集的函数,可以直接利用本语句句柄继续执行新的语句或是获取行计数(本次执行所影响的行数)之新的语句或是获取行计数(本次执行所影响的行数)之后继续执

99、行后继续执行v在插入数据时,采用了预编译的方式,首先通过在插入数据时,采用了预编译的方式,首先通过SQLPrepare来预处理来预处理SQL语句,然后将每一列绑语句,然后将每一列绑定到用户缓冲区定到用户缓冲区 An Introduction to Database System执行执行SQL语句(续)语句(续)v创建数据源创建数据源-第五步:执行第五步:执行SQL语句语句/* Step 5 两种方式执行语句两种方式执行语句 */* 预编译带有参数的语句预编译带有参数的语句 */ret=SQLPrepare(serverhstmt,INSERT INTO STUDENT(SNO,SNAME, S

100、SEX, SAGE,SDEPT) VALUES (?, ?, ?, ?, ?), SQL_NTS);if (ret=SQL_SUCCESS | ret=SQL_SUCCESS_WITH_INFO)ret=SQLBindParameter(serverhstmt,1,SQL_PARAM_INPUT, SQL_C_CHAR,SQL_CHAR,SNO_LEN,0,sSno,0, &cbSno); ret=SQLBindParameter(serverhstmt,2,SQL_PARAM_INPUT, SQL_C_CHAR,SQL_CHAR,NAME_LEN,0,sName,0,&cbName);ret

101、=SQLBindParameter(serverhstmt,3,SQL_PARAM_INPUT, SQL_C_CHAR,SQL_CHAR,2,0,sSex,0,&cbSex);ret=SQLBindParameter(serverhstmt,4,SQL_PARAM_INPUT, SQL_C_LONG,SQL_INTEGER,0,0,&sAge,0,&cbAge);An Introduction to Database System执行执行SQL语句(续)语句(续)ret=SQLBindParameter(serverhstmt,5,SQL_PARAM_INPUT, SQL_C_CHAR,SQL

102、_CHAR, DEPART_LEN, 0, sDepart,0, &cbDepart); /*执行执行SQL语句语句*/ret=SQLExecDirect(kinghstmt,SELECT * FROM STUDENT,SQL_NTS);if (ret=SQL_SUCCESS | ret=SQL_SUCCESS_WITH_INFO) ret=SQLBindCol(kinghstmt,1,SQL_C_CHAR,sSno,SNO_LEN,&cbSno);ret=SQLBindCol(kinghstmt,2,SQL_C_CHAR,sName,NAME_LEN,&cbName);ret=SQLBind

103、Col(kinghstmt,3,SQL_C_CHAR,sSex,SSEX_LEN,&cbSex);ret=SQLBindCol(kinghstmt,4,SQL_C_LONG,&sAge,0,&cbAge);ret=SQLBindCol(kinghstmt,5,SQL_C_CHAR,sDepart, DEPART_LEN,&cbDepart); 在在例例8.12中,使用中,使用SQLExecdirect获取获取KingbaseES中的中的结果集,并将结果集根据各列不同的数据类型绑定到用户程结果集,并将结果集根据各列不同的数据类型绑定到用户程序缓冲区序缓冲区 An Introduction to

104、Database System6. 结果集处理结果集处理 v应用程序可以通过应用程序可以通过SQLNumResultCols来获取结来获取结果集中的列数果集中的列数v通过通过SQL DescribeCol或是或是SQLColAttrbute函函数来获取结果集每一列的名称、数据类型、精度数来获取结果集每一列的名称、数据类型、精度和范围和范围 An Introduction to Database System结果集处理(续)结果集处理(续)vODBC中使用游标来处理结果集数据中使用游标来处理结果集数据 vODBC中游标类型中游标类型nForward-only游标,是游标,是ODBC的默认游标类型

105、的默认游标类型 n可滚动(可滚动(Scroll)游标)游标l静态(静态(static)l动态(动态(dynamic)l码集驱动(码集驱动(keyset-driven)l混合型(混合型(mixed)An Introduction to Database System结果集处理(续)结果集处理(续)v结果集处理步骤结果集处理步骤nODBC游标的打开方式不同于嵌入式游标的打开方式不同于嵌入式SQL,不是显式声,不是显式声明而是系统自动产生一个游标,当结果集刚刚生成时,明而是系统自动产生一个游标,当结果集刚刚生成时,游标指向第一行数据之前游标指向第一行数据之前 n应用程序通过应用程序通过SQLBind

106、Col把查询结果绑定到应用程序把查询结果绑定到应用程序缓冲区中,通过缓冲区中,通过SQLFetch或是或是SQLFetchScroll来移动来移动游标获取结果集中的每一行数据游标获取结果集中的每一行数据n对于如图像这类特别的数据类型,当一个缓冲区不足以对于如图像这类特别的数据类型,当一个缓冲区不足以容纳所有的数据时,可以通过容纳所有的数据时,可以通过SQLGetdata分多次获取分多次获取 n最后通过最后通过SQLClosecursor来关闭游标来关闭游标 An Introduction to Database System结果集处理(续)结果集处理(续)v创建数据源创建数据源-第六步:结果集

107、处理第六步:结果集处理/* Step 6 处理结果集并执行预编译后的语句处理结果集并执行预编译后的语句*/while (ret=SQLFetch(kinghstmt)!=SQL_NO_DATA_FOUND) if(ret=SQL_ERROR)printf(Fetch errorn);else ret=SQLExecute(serverhstmt); An Introduction to Database System7. 中止处理中止处理 v应用程序中止步骤应用程序中止步骤n释放语句句柄释放语句句柄 n释放数据库连接释放数据库连接 n与数据库服务器断开与数据库服务器断开 n释放释放ODBC环境

108、环境 An Introduction to Database System中止处理(续)中止处理(续)v创建数据源创建数据源-第七步:中止处理第七步:中止处理/* Step 7 中止处理中止处理*/SQLFreeHandle(SQL_HANDLE_STMT,kinghstmt);SQLDisconnect(kinghdbc);SQLFreeHandle(SQL_HANDLE_DBC,kinghdbc);SQLFreeHandle(SQL_HANDLE_ENV,kinghenv);SQLFreeHandle(SQL_HANDLE_STMT,serverhstmt);SQLDisconnect(s

109、erverhdbc);SQLFreeHandle(SQL_HANDLE_DBC,serverhdbc);SQLFreeHandle(SQL_HANDLE_ENV,serverhenv);return 0;An Introduction to Database System第八章第八章 数据库编程数据库编程8.1 嵌入式嵌入式SQL8.2 过程化过程化SQL8.3 存储过程和函数存储过程和函数8.4 ODBC编程编程*8.5 OLE DB*8.6 JDBC编程编程8.7 小结小结An Introduction to Database System8.7 小结小结v嵌入式嵌入式SQL把把SQL语句嵌入到某种高级语言中语句嵌入到某种高级语言中vSQL与主语言具有不同的数据处理方式与主语言具有不同的数据处理方式v本章讲解了以下内容本章讲解了以下内容n嵌入式嵌入式SQLn过程化过程化SQLn存储过程和函数存储过程和函数nODBC编程编程nOLE DBnJDBC编程编程

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号