标准SQL是非过程化的查询语句:
- 具有操作统一、面向集合、功能丰富、使用简单等多项优点。
- 但是它缺少流程控制能力,难以实现应用业务中的逻辑控制。
SQL编程技术:
- 有效克服SQL语言实现复杂应用方面的不足。
- 提高应用系统和数据库管理系统间的互操作性。
SQL的特点之一是在交互式和嵌入式两种不同的使用方式下,SQL的语法结构基本上是一致。
一、嵌入式SQL的处理过程
嵌入式SQL是将SQL语句嵌入程序设计语言中,被嵌入的程序设计语言(C/C++,JAVA)等称为宿主语言,简称主语言。
对于嵌入式SQL,数据库管理系统一般采用预编译方法处理,即由数据库管理系统的预处理程序对源程序进行扫描,识别出嵌入式SQL语句,把它们转换成主语言调用语句,以使主程序编译程序能识别它们,然后由主语言的编译程序将纯的主语言程序编译成目标码。
嵌入式SQL基本处理过程图示:
二、嵌入式SQL语句与主语言之间的通信
将SQL嵌入到高级语言中混合编程,SQL语句负责操纵数据库,高级语言语句负责控制逻辑流程。
数据库工作单元与源程序工作单元之间的通信
1. 向主语言传递SQL语句的执行状态信息,使主语言能够据此信息控制程序流程,主要用SQL通信区(SQLCA)实现。
2. 主语言向SQL语句提供参数,主要用主变量实现。
3. 将SQL语句查询数据库的结果交主语言处理,主要用主变量和游标实现。
1. SQL通信区
SQL语句执行后,系统要反馈给应用程序若干信息,主要包括描述系统当前工作状态和运行环境的各种数据。这些信息将送到SQL通信区中,应用程序从SQL通信区中取出这些状态信息,据此决定接下来执行的语句。
SQL通信区在应用程序中用EXEC SQL INCLUDE SQLCA加以定义。SQL通信区中有一个变量SQLCODE,用来存放每次执行SQL语句后返回的代码。如果SQLCODE等于预定义的常量SUCCESS,则表示语句成功,反之失败。
2. 主变量
嵌入式SQL语句可以使用主语言的程序变量来输入或输出数据。SQL语句使用的主语言程序变量称为主变量。主变量根据其作用的不同分为输入主变量和输出主变量。输入主变量由应用程序对其赋值,SQL语句引用;输出主变量由SQL语句对其赋值或设置状态信息,返回给应用程序。
一个主变量可以附带一个任选的指示变量。指示变量是一个整型变量,用来“指示”所指主变量的值或条件,指示变量可以指示输入主变量是否为空值,可以检测输出主变量是否为空值,值是否被截断。
所有主变量和指示变量必须在SQL语句BEGIN DECLARE SECTION 与END DECLARE SECTION 之间进行说明。说明之后,主变量可以在SQL语句中任何一个能够使用表达式的地方出现。
3. 游标
SQL是面向集合的,一条SQL语句可以产生或处理多条记录;而主语言是面向记录的,一组主变量一次只能存放一条记录。游标是用来处理这两种不同的处理方式的。
游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果,每个游标区都有一个名字,用户可以通过游标逐一获取记录并献给主变量,交由主语言进一步处理。
4. 建立和关闭数据库连接
嵌入式SQL程序要访问数据库必须先连接数据库,关系数据管理系统根据用户信息对连接请求进行合法性验证,只有通过了身份验证,才能建立一个可用的合法连接。
1. 建立数据库连接
SQL语句:EXEC SQL CONNECT TO target[AS connection-name] [ USER user-name]
target是要连接的数据库服务器
connection-name是可选的连接名
2. 关闭数据库连接
当某个连接上的所有数据库操作完成后,应用程序应该主动释放所占用的连接资源。关闭数据库连接的嵌入式SQL语句:EXEC SQL DISCONNECT[connection]
connection是EXEC SQL CONNECT 所建立的连接。
三、不用游标的SQL语句
有的嵌入式SQL语句是不需要游标的,它们是说明性语句、数据定义语句、数据控制语句、查询结果为单记录的SELECT语句、非CURRENT形式的增删改语句。
1. 查询结果为单记录的SELECT语句
这类语句因为查询结果只有一个,只用INTO子句指定存放查询结果的主变量,不需要使用游标。使用需注意:
1. INTO子句、WHERE子句和HAVING短语的条件表达式均可以使用主变量。
2. 查询结果为空值的处理。
3. 如果查询结果实际上并不是单条记录,而是多条记录,则程序出错,关系数据库管理系统会在SQL通信区中返回错误信息。
2. 非CURRENT形式的增删改语句
在UPDATE的SET子句和WHERE子句中可以使用主变量,SET子句还可以使用指示变量。
四、使用游标的SQL语句
必须使用游标的SQL语句有查询结果为多条记录的SELECT语句、CURRENT形式的UPDATE和DELETE语句。
1. 查询结果为多条记录的SELECT 语句
游标机制是将多条记录一次一条地送主程序处理,从而把对集合的操作转换为对单个记录的处理。使用步骤为:
1. 说明游标
用DECLARE语句为一条SELECT 语句定义游标:
EXEC SQL DECLARE<游标名>CURSOR FOR< SELECT 语句>
定义游标仅仅是一条说明性语句,这是关系数据库管理系统并不执行SELECT 语句。
2. 打开游标
用OPEN语句将定义的游标打开:EXEC SQL OPEN<游标名>
打开游标实际上是执行相应的SELECT语句,把查询结果取到缓冲区中。这时游标处于活动状态,指针指向查询结果集中的第一条记录。
3. 推进游标指针并去当前记录
EXEC SQL FETCH<游标名> INTO <主变量>[<指示变量>][,<主变量>[<指示变量>]]…
主变量必须与SELECT 语句中的目标列表达式具有一一对应关系。
用FETCH语句把游标指针向前推进一条记录,同时将缓冲区中的当前记录取出来送至主变量供主语言进一步处理,通过循环执行FETCH语句逐条取出结果集中的行进行行处理。
4. 关闭游标
用CLOSE语句关闭游标,释放结果集占用的缓冲区及其他资源。
EXEC SQL CLOSE<游标名>
游标被关闭后就不再与原来的查询结果集想联系,但被关系的游标可以再次被打开与新的查询结果相联系。
2. CURRENT形式的UPDATE和DELETE语句
当游标定义中的SELECT 语句带有UNION或ORDER BY子句,或者该SELECT 语句相当于定义了一个不可更新的视图,不能使用CURRENT形式的UPDATE语句和DELETE语句。
五、动态SQL
嵌入式SQL语句中使用的主变量、查询目标列、条件等都是固定的,属于静态SQL语句。动态SQL方法允许在程序过程中临时“组装”SQL语句。
动态SQL支持动态组装SQL语句和动态参数。
1. 使用SQL语句主变量
程序主变量包含的内容是SQL语句的内容,而不是原来保存数据的输入或输出变量,这样的变量称为SQL语句主变量。SQL语句主变量在程序执行期间可以设定不同的SQL语句,然后执行。
2. 动态参数
动态参数是SQL语句中的可变元素,使用参数符号(?)表示该位置的数据在运行时设定。动态参数的输入不是编译时完成绑定,而是通过PREPARE语句准备主变量和执行语句EXECUTE绑定数据或主变量来完成。使用动态参数的步骤如下:
1. 声明SQL语句主变量:SQL语句主变量的值包含动态参数(?)
2. 准备SQL语句(PREPARE):PREPARE将分析含主变量的SQL语句内容,建立语句中包含的动态参数的内部描述符,并用<语句名>标识它们的整体。
EXEC SQL PREPARE<语句名>FROM< SQL 语句主变量>
3. 执行准备好的语句(EXECUTE)
EXECUTE将SQL语句中分析出的动态参数和主变量或数据常量绑定,作为语句的输入或输出变量。
EXEC SQL EXECUTE<语句名>[INTO <主变量表> ] [USING <主变量或常量> ] ;
嵌入式SQL把SQL语句嵌入到某种高级语言中,SQL语句用来存取数据库中的数据,主语言用来控制程序流程以及对取出的数据做进一步加工处理,利用高级语言的强大计算能力来实现复杂应用的需求。