数据库系统——第九讲 嵌入式SQL语言之基本技巧

数据库系统——第九讲 嵌入式SQL语言之基本技巧

  • 嵌入式SQL语言概述
    • (1)交互式SQL语言的局限
    • (2)嵌入式SQL语言
    • (3)高级语言中使用嵌入式SQL语言需要解决的问题
  • 变量声明与数据库连接
    • (1)变量的声明与使用:
    • (2)程序与数据库的连接与断开
    • (3)SQL执行的提交与撤销
    • (4)事务的概念与特性
    • (5)事务的概念与特性
  • 数据集与游标
    • (1)如何读取单行数据和多行数据
    • (2)游标的使用概览
  • 可滚动游标与数据库的增删改
    • (1)可滚动游标的概念
    • (2)可滚动游标的定义和使用
    • (3)数据的删除与更新
  • 状态捕获及错误处理机制
    • (1)基本机制
    • (2)状态信息
  • 小结


嵌入式SQL语言概述

重点与难点:数据库语言嵌入到高级语言中使用需要解决的问题—过程及其思维

(1)交互式SQL语言的局限

交互式SQL语言有很多优点:
 记录集合操作
 非过程性操作:指出要做什么,而不需指出怎样做
 一条语句就可实现复杂查询的结果
然而,交互式SQL本身也有很多局限… …

  • 从使用者角度:专业人员可熟练写出SQL语句,但大部分的普通用户…
  • 从SQL本身角度:特别复杂的检索结果难以用一条交互式SQL语句完成,此时需要结合高级语言中经常出现的顺序、分支和循环结构来帮助处理

(2)嵌入式SQL语言

因此,高级语言+SQL语言
 既继承高级语言的过程控制性
 又结合SQL语言的复杂结果集操作的非过程性
 同时又为数据库操作者提供安全可靠的操作方式:通过应用程序进行操作
嵌入式SQL语言
 将SQL语言嵌入到某一种高级语言中使用
 这种高级语言,如C/C++, Java, PowerBuilder等,又称宿主语言(Host Language)
 嵌入在宿主语言中的SQL与前面介绍的交互式SQL有一些不同的操作方式

(3)高级语言中使用嵌入式SQL语言需要解决的问题

数据库系统——第九讲 嵌入式SQL语言之基本技巧_第1张图片


变量声明与数据库连接

(1)变量的声明与使用:

在嵌入式SQL语句中可以出现宿主语言语句所使用的变量:
exec sql select Sname, Sage into :vSname, :vSage from Student where Sname= :specName;
这些变量需要特殊的声明:
exec sql begin declare section;
char vSname[10], specName[10]=“张三”;
int vSage;
exec sql end declare section;

变量声明和赋值中,要注意:
宿主程序的字符串变量长度应比字符型字段的长度多1个。因宿主程序的字符串尾部多一个终止符为‘\0‘,而程序中用双引号来描述。
宿主程序变量类型与数据库字段类型之间有些是有差异的,有些DBMS可支持自动转换,有些不能。

(2)程序与数据库的连接与断开

程序与数据库的连接和断开
在嵌入式SQL程序执行之前,首先要与数据库进行连接
不同DBMS,具体连接语句的语法略有差异
SQL标准中建议的连接语法为:
execsql connecttotarget-server asconnect-name useruser-name;

execsql connecttodefault;
Oracle中数据库连接:
execsql connect:user_name identified by :user_pwd;
DB2 UDB中数据库连接:
execsql connecttomydb user:user_name using:user_pwd;
 在嵌入式SQL程序执行之后,需要与数据库断开连接
 SQL标准中建议的断开连接的语法为:
exec sql disconnect connect-name;

exec sql disconnect current;
 Oracle中断开连接:
exec sql commit release;

exec sql rollback release;
 DB2 UDB中断开连接:
exec sql connect reset;
exec sql disconnect current;

(3)SQL执行的提交与撤销

SQL执行的提交与撤消
SQL语句在执行过程中,必须有提交和撤消语句才能确认其操作结果
SQL执行的
提交

execsql commitwork;
SQL执行的
撤消**:
execsql rollbackwork;
为此,很多DBMS都设计了捆绑提交/撤消与断开连接在一起的语句,以保证在断开连接之前使用户确认提交或撤消先前的工作,例如Oracle中:
execsql commitrelease;

execsql rollbackrelease;

(4)事务的概念与特性

事务:

  • (从应用程序员角度)
    是一个存取或改变数据库内容的程序的一次执行,或者说一条或多条SQL语句的一次执行被看作一个事务
    事务一般是由应用程序员提出,因此有开始和结束,结束前需要提交或撤消。
    BeginTransaction
    execsql …

    execsql …
    execsql commit work |execsql rollback work
    EndTransaction

注意:在嵌入式SQL程序中,任何一条数据库操纵语句(如execsqlselect等)都会引发一个新事务的开始,只要该程序当前没有正在处理的事务。而事务的结束是需要应用程序员通过commit或rollback确认的。因此BeginTransaction和EndTransaction两行语句是不需要的。

  • (从微观角度,或者从DBMS角度)
    是数据库管理系统提供的控制数据操作的一种手段,通过这一手段,应用程序员将一系列的数据库操作组合在一起作为一个整体进行操作和控制,以便数据库管理系统能够提供一致性状态转换的保证。

(5)事务的概念与特性

事务的特性: ACID
原子性Atomicity : DBMS能够保证事务的一组更新操作是原子不可分的,即对DB而言,要么全做,要么全不做
一致性Consistency: DBMS保证事务的操作状态是正确的,符合一致性的操作规则,它是进一步由隔离性来保证的
隔离性Isolation: DBMS保证并发执行的多个事务之间互相不受影响。例如两个事务T1和T2, 即使并发执行,也相当于或者先执行了T1,再执行T2;或者先执行了T2, 再执行T1。
持久性Durability: DBMS保证已提交事务的影响是持久的,被撤销事务的影响是可恢复的。
换句话说:具有ACID特性的若干数据库基本操作的组合体被称为事务。


数据集与游标

重点与难点:怎样在高级语言中处理数据集—游标的使用技巧

(1)如何读取单行数据和多行数据

单行结果处理与多行结果处理的差异(Into子句与游标(Cursor))

  1. 检索单行结果,可将结果直接传送到宿主程序的变量中
  2. 检索多行结果,则需使用游标(Cursor)

(2)游标的使用概览

游标(Cursor)的使用需要先定义、再打开(执行)、接着一条接一条处理,最后再关闭
exec sql declare cur_student cursor for
select Sno, Sname, Sclass from Student where Sclass=‘035101’ ;
exec sql open cur_student;
exec sql fetch cur_student into :vSno, :vSname, :vSclass;
… …
exec sql close cur_student;

游标可以定义一次,多次打开(多次执行),多次关闭


可滚动游标与数据库的增删改

(1)可滚动游标的概念

ODBC支持的可滚动Cursor
标准的游标始终是自开始向结束方向移动的,每fetch一次,向结束方向移动一次;一条记录只能被访问一次;再次访问该记录只能关闭游标后重新打开
ODBC(OpenDataBase Connectivity)是一种跨DBMS的DB操作平台,它在应用程序与实际的DBMS之间提供了一种通用接口
许多实际的DBMS并不支持可滚动游标,但通过ODBC可以使用该功能

(2)可滚动游标的定义和使用

可滚动游标是可使游标指针在记录集之间灵活移动、使每条记录可以反复被访问的一种游标
数据库系统——第九讲 嵌入式SQL语言之基本技巧_第2张图片

NEXT向结束方向移动一条; PRIOR向开始方向移动一条;FIRST回到第一条;LAST移动到最后一条;ABSOLUTvalue_spec定向检索指定位置的行,value_spec由1至当前记录集最大值;RELATIVEvalue_spec相对当前记录向前或向后移动,value_spec为正数向结束方向移动,为负数向开始方向移动
可滚动游标移动时需判断是否到结束位置,或到起始位置

(3)数据的删除与更新

一种是查找删除(与交互式DELETE语句相同),一种是定位删除
EXEC SQL DELETE FROM tablename [corr_name]
WHERE search_condition | WHERE CURRENT OF cursor_name;

一种是查找更新(与交互式Update语句相同),一种是定位更新
EXEC SQL UPDATE tablename [corr_name]
SET columnname = expr [, columnname = expr …]
[ WHERE search_condition ] | WHERE CURRENT OF cursor_name


状态捕获及错误处理机制

重点与难点:错误捕获机制—设置错误陷阱与SQLCA的作用与使用

(1)基本机制

状态,是嵌入式SQL语句的执行状态,尤其指一些出错状态;有时程序需要知道这些状态并对这些状态进行处理
嵌入式 SQL程序中,状态捕获及处理有三部分构成:

  1. 设置SQL通信区:一般在嵌入式SQL程序的开始处便设置(exec sql include sqlca)
  2. 设置状态捕获语句:在嵌入式SQL程序的任何位置都可设置;可多次设置;但有作用域(exec sql whenever sqlerror goto report_error;)
  3. 状态处理语句:某一段程序以应对SQL操作的某种状态(report_error: exec sql rollback;)

状态捕获语句:exec sql whenever condition action;
Whenever语句的作用是设置一个“条件陷阱”, 该条语句会对其后面的所有由Exec SQL语句所引起的对数据库系统的调用自动检查它是否满足条件(由condition指出)
如果满足condition, 则要采取一些动作(由action指出)

(2)状态信息

典型DBMS系统记录状态信息的三种方法:

  1. sqlcode:
    典型DBMS都提供一个sqlcode变量来记录其执行sql语句的状态,但不同DBMS定义的sqlcode值所代表的状态意义可能是不同的,需要查阅相关的DBMS资料来获取其含义。
  2. sqlca.sqlcode
    典型DBMS都提供一个sqlcode变量来记录其执行sql语句的状态,但不同DBMS定义的sqlcode值所代表的状态意义可能是不同的,需要查阅相关的DBMS资料来获取其含义。
  3. sqlstate:
    有些DBMS提供的记录状态信息的变量是sqlstate或sqlca.sqlstate

小结

数据库系统——第九讲 嵌入式SQL语言之基本技巧_第3张图片

你可能感兴趣的:(sql,数据库,database)