数据库系统概论:第8章 数据库编程_第1页
数据库系统概论:第8章 数据库编程_第2页
数据库系统概论:第8章 数据库编程_第3页
数据库系统概论:第8章 数据库编程_第4页
数据库系统概论:第8章 数据库编程_第5页
已阅读5页,还剩134页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 S

5、ystem8.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,则表示,则表示SQL

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

10、o 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 Databas

13、e 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 conn

17、ection;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;EXEC

18、 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:5432

19、1 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“,S

21、sex, 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; /*提交更

23、新提交更新*/ EXEC SQL DISCONNECT 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语句的种类语句的种

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

25、句不需要使用游标,只需用INTO子句指定子句指定存放查询结果的主变量。存放查询结果的主变量。 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语句(续

26、)语句(续)v INTO子句、子句、WHERE子句和子句和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 Introducti

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

29、to Database System非非CURRENT形式的增删改语句(续)形式的增删改语句(续)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必须使用游标的

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

32、1)说明游标)说明游标(2)打开游标)打开游标(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语句格式语句格式 EXE

33、C SQL OPEN ;v功能功能n打开游标实际上是执行相应的打开游标实际上是执行相应的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. C

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

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

37、DATE语句和语句和DELETE语句(续)语句(续)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

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

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

40、ion to Database System使用使用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 Syste

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

42、准备SQL语句(语句(PREPARE)EXEC 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(

43、?); /*声明声明SQL主变量内容是主变量内容是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

44、第八章第八章 数据库编程数据库编程8.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增加了过程化语句功

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

46、m过程化过程化SQL的块结构(续)的块结构(续)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. 变量定义变

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

48、化过程化SQL8.2.1 过程化过程化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_

49、of_statements; END 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_state

50、ments; END LOOP; 多数数据库服务器的过程化多数数据库服务器的过程化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如果过程化如果过程化S

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

53、LE DB*8.6 JDBC编程编程8.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存储过程的优点存储过程的优点

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

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

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

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

59、em存储过程的用户接口(续)存储过程的用户接口(续)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

60、 System存储过程的用户接口(续)存储过程的用户接口(续)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存储过程的用户接口(续)存储过程的用户接

温馨提示

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

评论

0/150

提交评论