导图社区 数据库系统概论-第八章
华中师范大学情报学考研初试参考书,数据库编程,数据库编程概述,嵌入式SQL,过程化SQL,存储过程和函数,ODBC编程。
编辑于2022-06-04 15:32:42数据库编程
概述
SQL编程技术的优点
可以有效克服SQL语言实现复杂应用方面的不足,提高应用系统和数据库管理系统间的互操作性。
SQL编程方式
嵌入式SQL、过程化SQL、存储过程和自定义函数、开放数据库互连、OLE DB、Java数据库连接等。
嵌入式SQL
处理过程
嵌入式 SQL 是将 SQL 语句嵌入程序设计语言中,被嵌入的程序设计语言,如 C、C ++等称为宿主语言,简称主语言。 对嵌入式 SQL,数据库管理系统一般采用预编译方法处理。即由数据库管理系统的 预处理程序对源程序进行扫描,识别出嵌入式 SQL 语句,把它们转换成主语言调用 语句,以使主语言编译程序能识别它们,然后由主语言的编译程序将纯的主语言程 序编译成目标码。 所有SQL语句都必须加前缀。
与主语言之间的通信
通信过程
将 SQL 嵌入到高级语言中混合编程,SQL 语句负责操纵数据库,高级语言语句负责 控制逻辑流程。 数据库工作单元与源程序工作单元之间的通信主要包括: (1)向主语言传递 SQL 语句的执行状态信息,,使主语言能够据此信息控制程序流 程,主要用 SQL 通信区(SQL Communication Area, SQLCA)实现。 (2)主语言向 SQL 语句提供参数,主要用主变量(host variable)实现。 (3)将 SQL 语句查询数据库的结果交主语言处理,主要用主变量和游标(cursor) 实现。
术语解释
SQL通信区
定义
声明方式
功能
主变量
定义
根据作用的分类
指示变量
声明方式
游标
产生背景
定义
建立和关闭数据库连接
建立连接的前提
建立数据库连接
关闭数据库连接
不用游标的SQL语句
概述
有的嵌入式 SQL 语句不需要使用游标,它们是说明性语句、数据定义语句、数据控 制语句、查询结果为单记录的 SELECT 语句、非 CURRENT 形式的增删改语句。
具体语句
查询结果为单记录的SELECT语句
这类语句因为查询结果只有一个,只需用 INTO 子句指定存放查询结果的主变 量,不需要使用游标。 查询结果为单记录的 SELECT 语句需要注意以下几点: ①INTO 子句、WHERE 子句和 HAVING 短语的条件表达式中均可以使用主变量。 ②查询结果为空值的处理。查询返回的记录中可能某些列为空值 NULL。为了表示空值,在INTO子句的主变量后面跟有指示变量,当查询出的某个数据项为空值时,系统会自动将相应主变量后面的指示变量置为负值,且不再向该主变量赋值。 ③如果查询结果实际上并不是单条记录,而是多记录,则程序出错,关系数据库 管理系统会在 SQL 通信区中返回错误信息
非CURRENT形式的增删改语句
有些非 CURRENT 形式的增删改语句不需要使用游标。 在 UPDATE 的 SET 子句和 WHERE 子句中可以使用主变量, SET 子句还可以使用指示变量。
使用游标的SQL语句
概述
必须使用游标的 SQL 语句有查询结果为多条记录的 SELECT 语句、CURRNP 形式的 UPATE 和 DELETE 语句。
查询结果为多条记录的SELECT语句
一般,SELECT语句查询结果为多条记录,因此需要用游标机制将多条记录一次一条地送主程序处理,从而把对集合的操作转换为对单个记录的处理。 使用游标的步骤: (1)说明游标 (2)打开游标 (3)推进游标指针并取当前记录 (4)关闭游标
CURRENT形式的UPDATE和DELETE语句
UPDATE语句和 DELETE语句都是集合操作,如果只想修改或删除其中某个记录,则用带游标的 SELECT语句查出所有满足件的记录,从中进一步找出要修改或删除的后用 CURRENT形式的 UPDATE DELETE语句修改或删除之。 即 UPDATE语句和 DELETE语句中要用子句 WHERE CURRENT OF<游标名> 来表示修改或删除的是最近一次取出的记录。
动态SQL
概述
静态嵌入式 SQL 语句能够满足一般要求,但某些应用可能要到执行时才能够确定要 提交的 SQL 语句、查询的条件,此时就要使用动态 SQL 语句来解决这类问题。 动态 SQL 方法允许在程序运行过程中临时“组装”SQL 语句。动态 SQL 支持动态组装 SQL 语句和动态参数两种形式,给开发者提供设计任意 SQL 语句的能力。
步骤
使用SQL语句主变量
程序主变量包含的内容是SQL语句的内容,而不是原来保存数据的输入或输出变量这样的变量称为SQL语句主变量。SQL语句主变在程序执行期间可以设定不同的S0语句,然后立即执行。
动态参数
动态参数是SQL语句中的可变元素,使用参数号(?)表示该位置的数据在运时设定。和前面使用的主变量不同,动态参数的输不是编译时完成绑定,而是通过PREPARE语句准备主变量和执行语句 EXECUTE绑定数据或主变量来完成。 使用动态数的步骤如下: (1)声明SOL语句主变量 SQL语句主变量的值包含动态参数(?)。 (2)准备SQL语句( PREPARE) PREPARE将分析含主变量的SQL语句内容,建立语句中包含的动态参数的内部描符,并用<语句名>标识它们的整体。 EXEC SQL PREPARE<语句名>FROM<SQL语句主变量>;
执行准备好的语句
EXECUTE将SQL语句中分析出的动态参数和主变量或数据常量绑定,作为语句的输入或输出变量。
过程化SQL
块结构
过程化 SQL 是对 SQL 的扩展,使其增加了过程化语句功能。过程化 SQL 程序的基本 结构是块。所有的过程化 SQL 程序都是由块组成的。这些块之间可以互相嵌套,每个块完成一个逻辑操作。
变量和常量的定义
变量的定义
变量名 数据类型 [[NOT NULL]:=初值表达式]
常量的定义
常量名 数据类型 CONSTANT:=常量表达式 常量必须要给一个值,并且该值在存在期间或常量的作用域内不能改变
赋值语句
变量名:=表达式
流程控制
条件控制语句
IF语句
IF-THEN语句
嵌套的IF语句
循环控制语句
LOOP循环语句
WHILE-LOOP循环语句
FOR-LOOP循环语句
错误处理
如果在执行时出现了异常,则应该让程序在产生异常的语句处停下来,根据异常的类型去执行异常处理语句。
存储过程和函数
概述
过程化 SQL 块主要有两种类型,即命名块和匿名块。匿名块每次执行时都要进行编 译,它不能被存储到数据库中,也不能在其他过程化 SQL 块中调用,前面的都是匿名块。 过程和函数是 命名块,它们被编译后保存在数据库中,称为持久性存储模块,可以被反复调用, 运行速度较快。
存储过程
定义
存储过程是由过程化 SQL 语句书写的过程,这个过程经编译和优化后存储在数据库 服务器中,因此称它为存储过程,使用时只要调用即可。
优点
①由于存储过程不像解释执行的SQL语句那样在提出操作请求时才进行语法分析 和优化工作,因而运行效率高,它提供了在服务器端快速执行 SQL 语句的有效 途径。 ②存储过程降低了客户机和服务器之间的通信量。 ③方便实施企业规则。
存储过程的用户接口
创建存储过程
CREATE OR REPLACE PROCEDURE 过程名 ([参数1,参数2,....])/*存储过程首部*/ AS<过程化SQL块>; /*存储过程体,描述该存储过程的操作*/ 存储过程包括过程首部和过程体。 在过程首部,“过程名”是数据库服务器合法的对象标识 参数列表[参数1,参数2,…]用名来标识调用时给出的参数值,必须指定值的数据类型。可以定义输入参数、输出参数或入/输出参数,默认为输入参数,也可无参数。 过程体是一个<过程化SQL块>,包括声明部分可执行语句部分。
执行存储过程
CALL/PERFROM PROCEDURE 过程名([参数1,参数2,...]);
修改存储过程
使用ALTER PROCEDURE重命名一个存储过程: ALTER PROCEDURE 过程名1 RENAME TO 过程名2; 可以使用ALTER PROCEDURE重新编译一个存储过程: ALTER PROCEDURE 过程名 COMPILE;
删除存储过程
DROP PROCEDURE 过程名();
函数
概述
本章讲解的函数也称为自定义函数,因为是用户己使用过程化SQL设计定义的函数和存储过程类似,都是持久性存储模块。函数的定义和存储过程也类似,不同之处是函数必须指定返回的类型。
定义语句
CREATE OR REPLACE FUNCTION 函数名([参数1,参数2,) RETURNS<类型> AS <过程化SQL块>;
执行语句
CALL/ SELECT 函数名([参数1,参数2,...]);
修改函数
可以使用 ALTER FUNCTION重命名一个自定义函数: ALTER FUNCTION过程名1 RENAME TO过程名2; 可以使用 ALTER FUNCTION重新编译一个函数 ALTER FUNCTION 函数名 COMPILE;
ODBC编程
概述
目前广泛使用的关系数据库管理系统有多种,尽管这些系统都属于关系数据库,也 都遵循 SQL 标准,但是不同的系统有许多差异。因此在某个关系数据库管理系统下 编写的应用程序并不能在另一个关系数据库管理系统下运行,适应性和可移植性较 差。许多应用程序需要共享多个部门的数据资源,访问不同的关系数据库管理系统。 为此,人们开始研究和开发连接不同关系数据库管理系统的方法、技术和软件,使 数据库系统“开放”,能够实现“数据库互连”。 ODBC 建立了一组规范,并提供一组 访问数据库的应用程序编程接口( API)。ODBC 具有两重功效或约束力:一方面规 范应用开发,另一方面规范关系数据库管理系统应用接口。
工作原理
体系结构示例
ODBC 应用系统的体系结构由 4 部分构成:用户应用程序、ODBC 驱动程序管理器、 数据库驱动程序、数据源。
组成部分
用户应用程序
使用 ODBC 来开发应用系统的程序简称为 ODBC 应用程序,包括 的内容有: ①请求连接数据库。 ②向数据源发送 SQL 语句。 ③为 SQL 语句执行结果分配存储空间,定义所读取的数据格式。 ④获取数据库操作结果或处理错误。 ⑤进行数据处理并向用户提交处理结果。 ⑥请求事务的提交和回滚操作。 ⑦断开与数据源的连接。
ODBC驱动程序管理器
驱动程序管理器用来管理各种驱动程序,管理应用程序 和驱动程序之间的通信。 ODBC 驱动程序管理器的主要功能包括装载 ODBC 驱动 程序、选择和连接正确的驱动程序、管理数据源、检查 ODBC 调用参数的合法 性及记录 ODBC 函数的调用等。 ODBC 驱动程序管理器可以建立、配置或删除数据源,并查看系统当前所安装的数据库ODBC驱动程序。
数据库驱动程序
ODBC 通过数据库驱动程序来提供应用系统与数据库平台的独 立性。 ODBC 应用程序不能直接存取数据库,其各种操作请求由驱动程序管理器 提交给某个关系数据库管理系统的 ODBC 驱动程序,通过调用驱动程序所支持 47 的函数来存取数据库。数据库的操作结果也通过驱动程序返回给应用程序。如 果应用程序要操纵不同的数据库,就要动态地链接到不同的驱动程序上。 目前 的 ODBC 驱动程序主要有单束和多束两类。单束一般是数据源和应用程序在同一台机器上,驱动程序直接完成对数据文件的I/O操作,这时驱动程序相当于数据管理器。多束驱动程序支持客户机-服务器、客户机-用服务器/数据库服务器等网络环境下的数据访问,这时由驱动程序完成数据库访问请求提交和结果集接收,应用程序使用驱动程序提供的结果集管理接口操纵执行后的结果数据
ODBC数据源管理
数据源是最终用户需要访问的数据,包含了数据库位置和数据库类型等信息, 实际上是一种数据连接的抽象。 ODBC 给每个被访问的数据源指定唯一的数据源 名并映射到所有必要的、用来存取数据的低层软件。在连接中,用数据源名来 代表用户名、服务器名、所连接的数据库名等。最终用户无须知道数据库管理 系统或其他数据管理软件、网络以及有关 ODBC 驱动程序的细节,数据源对最 终用户是透明的。
API基础
基础
各个数据库厂商的 ODBC 应用程序编程接口(ODBC API)都要符合两方面的一致性 ①APl 一致性,包含核心级、扩展 1 级、扩展 2 级。 ②语法一致性,包含最低限度 SQL 语法级、核心 SQL 语法级、扩展 SQL 语法级。
术语解释
函数概述
ODBC3.0标准提供了76个函数接口,大致可以分为: 1.分配和释放环境句柄、连接句柄、语句句柄。 2.连接函数 3.与信息有关的函数 4.事务处理函数 5.执行相关函数 6.编目函数
句柄及其属性
句柄是 32 位整数值,代表一个指针。ODBC3.0 中因句柄可以分为环境句柄、连接 句柄、语句句柄和描述符句柄 4 类。这 4 种句柄的关系: ①每个 ODBC 应用程序需要建立一个 ODBC 环境,分配一个环境句柄,存取数据的 全局性背景。 ②一个环境句柄可以建立多个连接句柄,每一个连接句柄实现与一个数据源之间 的连接。 ③在一个连接中可以建立多个语句句柄,它不只是一个 SQL 语句,还包括 SQL 语 句产生的结果集以及相关的信息等。 ④在 ODBC3.0 中又提出了描述符句柄的概念,它是描述 SQL 语句的参数、结果集 列的元数据集合
数据类型
ODBC定义了两套数据类型,即SQL数据类型和C数据类型。 SQL数据类型用于数据源,C数据类型用于应用程序的C代码。
工作流程
配置数据源
初始化环境
建立连接
分配语句句柄
执行SQL语句
结果集处理
中止处理