数据库系统概论 第八章数据库编程(2)过程化SQL常量,赋值语句,流程控制,错误处理,存储过程,用户接口,函数,ODBC概述,数据库驱动程序,驱动程序管理器,用户应用程序,

第12讲,数据库编程之过程化SQL

突破SQL语言的局限性的三种技术方案:
1.利用高级语言的表达能力:嵌入式SQL
2.扩展SQL语言对于过程控制的表达能力:过程化SQL
3.在一个更大的视野上,讲数据库看作是一类数据源:ODBC编程
嵌入式SQL技术路线的问题
在数据库空间和高级语言空间之间的通讯,需要额外的代价
数据库系统概论 第八章数据库编程(2)过程化SQL常量,赋值语句,流程控制,错误处理,存储过程,用户接口,函数,ODBC概述,数据库驱动程序,驱动程序管理器,用户应用程序,
过程化SQL技术的路线的又是
尽量减少系统之间的通讯和协同!
如果把嵌入式SQL中的数据库看作是仆人的话,那么这个仆人现在要做自己的主人了
数据库系统概论 第八章数据库编程(2)过程化SQL常量,赋值语句,流程控制,错误处理,存储过程,用户接口,函数,ODBC概述,数据库驱动程序,驱动程序管理器,用户应用程序,
过程化SQL的基本结构
过程化SSQL(也称为PL/SQL)是对SQL的扩展
基本结构是块(BLOCK)
块可以是嵌套的(调用)
每一个块可以完成一个逻辑操作
增加了变量,常量等定义语句
增加了变量赋值语句
增加了流程控制语句

过程SQL块的基本结构
1.定义部分
DELCARE变量,常量,游标,异常等
定义的变量,常量等只能在该基本块中使用
当基本块执行结束的时候,定义就不再存在
2.执行部分
BEGIN
SQL语句,过程化SQL的流程控制语句
EXCEPTION
异常处理部分
END;

变量的定义
1.变量的定义
变量名 数据类型[[NOT NULL]:=初值表达式]或者
变量名 数据类型 [[ NOT NULL] 初值表达式】
2.距离
DECLARE /定义变量/
totalDepositOut Float:=0;
totalDeposit Float:=0;
intAccountnum INT NOT NULL;

常量的定义
1.常量的定义
常量名 数据类型 CONSTANT:=常量表达式
常量必须要给一个值,并且该值在存在期间或者常量作用域内不饿能改变,如果试图修改它,过程化SQL将返回一个异常
2.举例
errorMsg string CONSTANT:=“Nested SQL error”

赋值语句
1.赋值语句
变量名称:=表达式
SET 变量名称=表达式
2.举例
SET Sno=Sno+1;

流程控制语句
1.条件控制语句
2.循环控制语句
3.错误处理语句

一、 条件控制语句
IF-THEN, IF-THEN-ELSE和嵌套的IF语句
1. IF condition THEN
Sequence_of_statements;
END IF
2. IF condition THEN
Sequence_of_statements1;
ELSE
Sequence_of_statements2;
END IF;
3. 在THEN和ELSE子句中还可以再包括IF语句,即IF语句可以嵌套

二、循环控制语句
LOOP, WHILE-LOOP和FOR-LOOP
1.最简单的循环语句LOOP
LOOP
Sequence_of_statements;
END LOOP;
多数数据库服务器的PL/SQL都提供EXIT、BREAK或LEAVE等循环结束语句,保证LOOP语句块能够结束。

  1. WHILE-LOOP
    WHILE condition LOOP
    Sequence_of_statements;
    END LOOP;
    每次执行循环体语句之前,首先对条件进行求值
    如果条件为真,则执行循环体内的语句序列。
    如果条件为假,则跳过循环并把控制传递给下一个语句
  2. FOR-LOOP
    FOR count IN [REVERSE]bound1 … bound2 LOOP
    Sequence_of_statements;
    END LOOP;

三、错误处理:
如果PL/SQL在执行时出现异常,则应该让程序在产生异常的语句处停下来,根据异常的类型去执行异常处理语句
SQL标准对数据库服务器提供什么样的异常处理做出了建议,要求PL/SQL管理器提供完善的异常处理机制
数据库系统概论 第八章数据库编程(2)过程化SQL常量,赋值语句,流程控制,错误处理,存储过程,用户接口,函数,ODBC概述,数据库驱动程序,驱动程序管理器,用户应用程序,
存储过程
由过程化SQL语句书写的一段程序,经过编译和优化后,命名并存储在数据库服务器中,使用的时候只要调用即可。
存储过程的优点:
1.运行效率高
2.降低客户机和服务器之间的通信量
3.方便实施企业规划。

过程化SQL块类型
命名块
编译后保存在数据库中,可以被反复调用,运行速度较快,过程和函数是命名块
匿名块
每次执行的时候都要进行编译,他不能被存储到数据库中,也不能在其他过程化SQL块中调用

用户接口
1.创建存储过程
2.执行存储过程
3.修改存储过程
4.删除存储过程

存储过程:由PL/SQL语句书写的过程,经编译和优化后存储在数据库服务器中,使用时只要调用即可。
一、存储过程的优点:
1. 运行效率高
2. 降低了客户机和服务器之间的通信量
3. 方便实施企业规则

二、 存储过程的用户接口

  1. 创建存储过程:
    CREATE Procedure 过程名([参数1,参数2,…]) AS
    <PL/SQL块>;
    过程名:数据库服务器合法的对象标识
    参数列表:用名字来标识调用时给出的参数值,必须指定值的数据类型。参数也可以定义输入参数、输出参数或输入/输出参数。默认为输入参数。
    过程体:是一个<PL/SQL块>。包括声明部分和可执行语句部分

[例11] 利用存储过程来实现下面的应用: 从一个账户转指定数额的款项到另一个账户中。
CREATE PROCEDURE TRANSFER(inAccount INT, outAccount INT, amount FLOAT)
AS DECLARE
totalDeposit FLOAT;
BEGIN /* 检查转出账户的余额 /
SELECT total INTO totalDeposit
FROM ACCOUNT WHERE ACCOUNTNUM=outAccount;
IF totalDeposit IS NULL THEN /
账户不存在或账户中没有存款 /
ROLLBACK;
RETURN;
END IF;
IF totalDeposit < amount THEN /
账户账户存款不足 /
ROLLBACK;
RETURN;
END IF;
UPDATE account SET total=total-amount
WHERE ACCOUNTNUM=outAccount;
/
修改转出账户,减去转出额 /
UPDATE account SET total=total + amount
WHERE ACCOUNTNUM=inAccount;
/
修改转入账户,增加转出额 /
COMMIT; /
提交转账事务 */
END;

重命名存储过程
ALTER Procedure 过程名1 RENAME TO 过程名2;

  1. 执行存储过程:
    CALL/PERFORM Procedure 过程名([参数1,参数2,…]);
    使用CALL或者PERFORM等方式**存储过程的执行。
    在PL/SQL中,数据库服务器支持在过程体中调用其他存储过程

[例12]从账户01003815868转一万元到01003813828账户中。
CALL Procedure TRANSFER(01003813828,01003815868,10000);

  1. 删除存储过程
    DROP PROCEDURE 过程名();
    4.删除存储过程
    ALTER PROCEDURE 过程名1 RENAME TO过程名2;
    函数
    函数和存储过程的异同
    相同点:都是持久性存储模块
    异:函数必须指定返回的类型

数据库系统概论 第八章数据库编程(2)过程化SQL常量,赋值语句,流程控制,错误处理,存储过程,用户接口,函数,ODBC概述,数据库驱动程序,驱动程序管理器,用户应用程序,
第十三将 ODBC概述
数据库系统概论 第八章数据库编程(2)过程化SQL常量,赋值语句,流程控制,错误处理,存储过程,用户接口,函数,ODBC概述,数据库驱动程序,驱动程序管理器,用户应用程序,
ODBC优点:
移植性好
能同时访问不同的数据库
共享多个数据资源

ODBC产生的原因:
由于不同的数据库管理系统的存在,在某个RDBMS下编写的应用程序就不能在另一个RDBMS下运行
许多应用程序需要共享多个部门的数据资源,访问不同的RDBMS
ODBC:
是微软公司开放服务体系(Windows Open Services Architecture,WOSA)中有关数据库的一个组成部分
提供了一组访问数据库的标准API

ODBC约束力:
规范应用开发
规范RDBMS应用接口

RDBMS必须实现所有的ODBC接口
ODBC接口提供的功能必须完备
使用ODBC提供的接口而不是RDBMS的接口来进行应用的开发

ODBC应用系统的体系结构
1.用户应用程序
2.ODBC驱动程序管理器
3.数据库驱动程序
4.数据源
数据库系统概论 第八章数据库编程(2)过程化SQL常量,赋值语句,流程控制,错误处理,存储过程,用户接口,函数,ODBC概述,数据库驱动程序,驱动程序管理器,用户应用程序,
数据库系统概论 第八章数据库编程(2)过程化SQL常量,赋值语句,流程控制,错误处理,存储过程,用户接口,函数,ODBC概述,数据库驱动程序,驱动程序管理器,用户应用程序,
数据库系统概论 第八章数据库编程(2)过程化SQL常量,赋值语句,流程控制,错误处理,存储过程,用户接口,函数,ODBC概述,数据库驱动程序,驱动程序管理器,用户应用程序,
1.用户应用程序
ODBC应用程序包括的内容
请求连接数据库;
向数据源发送SQL语句;
为SQL语句执行结果分配存储空间,定义所读取的数据格式;
获取数据库操作结果,或处理错误;
进行数据处理并向用户提交处理结果;
请求事务的提交和回滚操作;
断开与数据源的连接。

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

三、数据库驱动程序
ODBC通过驱动程序来提供应用系统与数据库平台的独立性
ODBC应用程序不能直接存取数据库
其各种操作请求由驱动程序管理器提交给某个RDBMS的ODBC驱动程序
通过调用驱动程序所支持的函数来存取数据库。
数据库的操作结果也通过驱动程序返回给应用程序。
如果应用程序要操纵不同的数据库,就要动态地链接到不同的驱动程序上。

ODBC驱动程序类型:
单束
数据源和应用程序在同一台机器上
驱动程序直接完成对数据文件的I/O操作
驱动程序相当于数据管理器
多束
支持客户机/服务器、客户机/应用服务器/数据库服务器等网络环境下的数据访问
由驱动程序完成数据库访问请求的提交和结果集接收
应用程序使用驱动程序提供的结果集管理接口操纵执行后的结果数据
四、ODBC数据源管理
数据源:是最终用户需要访问的数据,包含了数据库位置和数据库类型等信息,是一种数据连接的抽象
数据源对最终用户是透明的
ODBC给每个被访问的数据源指定唯一的数据源名(Data Source Name,简称DSN),并映射到所有必要的、用来存取数据的低层软件
在连接中,用数据源名来代表用户名、服务器名、所连接的数据库名等
最终用户无需知道DBMS或其他数据管理软件、网络以及有关ODBC驱动程序的细节

例如,假设某个学校在MS SQL Server和KingbaseES上创建了两个数据库:学校人事数据库和教学科研数据库。
学校的信息系统要从这两个数据库中存取数据
为方便与两个数据库连接,为学校人事数据库创建一个数据源名PERSON,为教学科研数据库创建一个名为EDU的数据源。
当要访问每一个数据库时,只要与PERSON和EDU连接即可,不需要记住使用的驱动程序、服务器名称、数据库名

添加数据源
使用ODBC的第一步是首先要建立数据源名
在Win7中打开ODBC数据源管理器
在开始菜单上,指向管理工具,然后单击数据源ODBC
数据库系统概论 第八章数据库编程(2)过程化SQL常量,赋值语句,流程控制,错误处理,存储过程,用户接口,函数,ODBC概述,数据库驱动程序,驱动程序管理器,用户应用程序,
数据库系统概论 第八章数据库编程(2)过程化SQL常量,赋值语句,流程控制,错误处理,存储过程,用户接口,函数,ODBC概述,数据库驱动程序,驱动程序管理器,用户应用程序,
总结:ODBC编程
优点:
应用程序的移植性号
能够在一个应用中同时访问不同的数据库

ODBC API基础
ODBC 应用程序接口的一致性
API一致性
API一致性级别有核心级、扩展1级、扩展2级
语法一致性
语法一致性级别有最低限度SQL语法级、核心SQL语法级、扩展SQL语法级

一、 函数概述
二、 句柄及其属性
三、 数据类型

1.函数概述
数据库系统概论 第八章数据库编程(2)过程化SQL常量,赋值语句,流程控制,错误处理,存储过程,用户接口,函数,ODBC概述,数据库驱动程序,驱动程序管理器,用户应用程序,
ODBC 3.0 标准提供了76个函数接口:
分配和释放环境句柄、连接句柄、语句句柄;
连接函数(SQLDriverconnect等);
与信息相关的函数(如获取描述信息函数SQLGetinfo、SQLGetFuction);
事务处理函数(如SQLEndTran);
执行相关函数(SQLExecdirect、SQLExecute等);
编目函数,ODBC 3.0提供了11个编目函数如SQLTables、SQLColumn等,应用程序可以通过对编目函数的调用来获取数据字典的信息如权限、表结构等

ODBC不同版本上的函数和函数使用是有差异的,读者必须注意使用的版本
ODBC 1.0和ODBC 2.x、ODBC 3.x函数使用上有很多差异
MFC ODBC对较复杂的ODBC API进行了封装,提供了简化的调用接口

二、 句柄及其属性
句柄是32位整数值,代表一个指针
ODBC 3.0中句柄分类:
环境句柄
连接句柄
语句句柄
描述符句柄

应用程序句柄之间的关系
数据库系统概论 第八章数据库编程(2)过程化SQL常量,赋值语句,流程控制,错误处理,存储过程,用户接口,函数,ODBC概述,数据库驱动程序,驱动程序管理器,用户应用程序,

  1. 每个ODBC应用程序需要建立一个ODBC环境,分配一个环境句柄,存取数据的全局性背景如环境状态、当前环境状态诊断、当前在环境上分配的连接句柄等;
  2. 一个环境句柄可以建立多个连接句柄,每一个连接句柄实现与一个数据源之间的连接;
  3. 在一个连接中可以建立多个语句句柄,它不只是一个SQL语句,还包括SQL语句产生的结果集以及相关的信息等;
  4. 在ODBC 3.0中又提出了描述符句柄的概念,它是描述SQL语句的参数、结果集列的元数据集合。
    数据库系统概论 第八章数据库编程(2)过程化SQL常量,赋值语句,流程控制,错误处理,存储过程,用户接口,函数,ODBC概述,数据库驱动程序,驱动程序管理器,用户应用程序,

三、 数据类型
ODBC数据类型:
SQL数据类型:用于数据源
C数据类型 :用于应用程序的C代码
应用程序可以通过SQLGetTypeInfo来获取不同的驱动程序对于数据类型的支持情况
数据库系统概论 第八章数据库编程(2)过程化SQL常量,赋值语句,流程控制,错误处理,存储过程,用户接口,函数,ODBC概述,数据库驱动程序,驱动程序管理器,用户应用程序,
数据库系统概论 第八章数据库编程(2)过程化SQL常量,赋值语句,流程控制,错误处理,存储过程,用户接口,函数,ODBC概述,数据库驱动程序,驱动程序管理器,用户应用程序,
数据库系统概论 第八章数据库编程(2)过程化SQL常量,赋值语句,流程控制,错误处理,存储过程,用户接口,函数,ODBC概述,数据库驱动程序,驱动程序管理器,用户应用程序,

数据库系统概论 第八章数据库编程(2)过程化SQL常量,赋值语句,流程控制,错误处理,存储过程,用户接口,函数,ODBC概述,数据库驱动程序,驱动程序管理器,用户应用程序,