4-4嵌入式SQL

4-4嵌入式SQL

tags:数据库

为什么会有嵌入式SQL

标准的SQL是非过程化的查询语言,就具有操作统一,面向集合,功能丰富,使用简单等多项优点,但和程序设计语言相比,高度非过程花的优点也造成了它的一个缺点:缺少流程控制能力,难以实现应用业务中的逻辑空值.SQL编程技术可以有效克服SQL语言实现复杂应用方面的不足.提高应用系统和数据库管理系统之间的互操作性.

应用系统中使用sql编程的主要方式

  1. 嵌入式SQL
  2. 过程化SQL
  3. 存储过程和自定义函数
  4. 开放数据库互连
  5. JDBC等等

嵌入式SQL处理过程

嵌入式SQL是将SQL语句潜入程序设计语言中,被嵌入的程序设计语言,如C++,JAVA等称为宿主语言,简称主语言.


嵌入式SQL,数据库管理系统一般采用预编译方法处理,即由数据库管理系统的预处理程序对源程序进行扫描,识别出嵌入式SQL语句,把它们转换成主语言调用语句,以使主语言编译程序能识别它们,然后由主语言的编译程序将纯的主语言程序编译成目标码.


Created with Raphaël 2.1.0 Start 含有嵌入式SQL语句的主语言程序 关系数据库管理系统预处理程序转换嵌入式SQL语句为函数调用 转换后的主语言程序 主语言编译程序编译处理 目标语言程序

在嵌入式SQL中,为了能够快速区分SQL语言与主语言语句,所有SQL语句都必须加前缀.C语言的语法格式为:

EXEC SQL <SQL语句>

嵌入式SQL语句和主语言之间的通信

数据库工作单元域源程序之间的主要通信内容

  1. 向主语言传递SQL语句的执行状态信息,使主语言能够据此信息空值程序流程,主要用SQL通信区实现.
  2. 主语言向SQL语句提供参数,主要用主变量实现.
  3. 将SQL语句查询数据库的结果交给主语言处理,主要使用主变量和游标来实现.

SQL通信区

SQL语句执行后,系统要反馈给应用程序若干信息,主要包括描述系统当前工作状态和运行环境的各种数据.这些信息将送到SQL通信区中,应用程序从SQL通信区中取出这些状态信息,据此决定接下来执行的语句.
SQL通信区在应用程序中用EXEC SQL INCLUDE SQLCA定义.SQL通信区中有一个变量SQLCODE,用来存放每次执行SQL语句后返回的代码.
每次程序执行完一条SQL语句之后都应该测试一下SQLCODE的值,以了解该SQL语句执行情况并作相应处理.

主变量

嵌入式SQL语句中可以使用主语言程序变量输入或者输出数据.SQL语句中使用的主语言程序变量简称为主变量.
一个主变量可以附带一个任选的指示变量.指示变量是一个整形变量,可以用来指示所指主变量的值或者条件.指示变量可以指示输入主变量是否为空值,可以检测输出主变量是否为空值或者值是否被截断.

游标

SQL是面向集合淡定,一条SQL语句可以产生或者处理多条记录,然而主语言是面向记录的,一组主变量一次只能存放一条记录.所以仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求,为此嵌入式SQ引入了游标的概念,用游标协调这两种不同的处理方式.


游标是系统为用户开设的一个数据管冲去,存放SQL语句的执行结果,每个游标区都有一个名字.用户可以通过游标逐一获取记录并赋值给主变量,交由主语言进一步处理.

建立和关闭数据库连接

嵌入式SSQL程序要访问数据库必须先连接数据库,关系数据库管理系统根据用户信息对链接请求进行合法性验证,只有通过了身份验证才能建立一个可用的合法链接.
建立数据库链接:
EXEC SQL CONNECT TO target[AS connection-name][User user-name]
关闭数据库链接:
EXEC SQL DISCONNECT[connection]

程序示例

EXEC SQL BEGIN DECLARE SECTION; /*主变量说明开始*/
char HSname[20];
char NEWname[20];
EXEC SQL END DECLARE SECTION; /*主变量声明结束*/
long SQLCODE;
EXEC SQL INCLUDE SQLCODE; /*定义SQL通信区*/
int main()
{
    ...
    EXEC SQL CONNECT TO TEST@localhost:54321 USER"SYSTEM"/"MANAGER";/*连接到数据库TEST*/
    EXEC SQL DECLARE SX CURSOR FOR /*定义游标SX*/
        select * form student;  /*SX对应的语句*/
    EXEC SQL OPEN SX;           /*打开游标,指向查询结果的第一行*/
    for(;;)
    {
       EXEC SQL FETCH SX INTO: HSname/*推进游标,将当前数据放入主变量*/
    }
    if(SQLCA.SQLCODE!=0) break;/*利用SQLCA中状态信息判断何时退出循环*/

    EXEC SQL UPDATE student set Sname =:NEWname
    where current of sx; /*对当前游标指向的学生年龄进行更新*/
    EXEC SQL CLOSE SX;          /*关闭游标不再和查询结果对应*/
    EXEC SQL COMMIT WORK; /*提交更新结果*/
    EXEC SQL DISCONNECT TEST;/*断开数据库链接*/
}
打开游标

用open打开游标,打开游标实际上是执行相应的select语句,把结果放到缓冲区中.这时游标处于活动状态,指针指向查询结果集中的第一条记录.

推进游标
EXECSQL FETCH<游标名>
    INTO <主变量>[<指示变量>][,<主变量>[<指示变量>]]...

fetch语句把游标指针向前推荐一条记录,同时将缓冲区中的当前记录取出来送至主变量供主语言进一步处理.

第六章 嵌入式SQL(E-SQL)简介 3 第一节 什么是嵌入SQL语言? 3 1.1 嵌入SQL程序的组成元素 3 1.2 什么是静态SQL和动态SQL? 4 1.3 什么是SQLCA? 4 1.4 什么是SQLDA? 5 第二节 SYBASE SQL SERVER嵌入式SQL语言 5 2.1 一个嵌入SQL语言的简单例子 5 2.2 嵌入SQL的处理过程 6 2.3 嵌入SQL语句总览 7 2.3.1 宿变量 7 2.3.2 连接数据库 12 2.3.3 数据的查询和修改 13 2.3.4 游标的使用 13 2.3.5 SQLCA 15 2.3.6 WHENEVER 16 2.3.7 批处理 18 2.3.8 事务 18 2.4动态SQL语句 18 2.4 .1 动态修改 19 2.4.2 动态游标 20 2.4.3 SQLDA 23 2.4.4 DESCRIBE语句 27 2.5 两个例子程序 27 2.5.1 TELECOM程序 27 2.5.2 ADHOC程序 29 第三节 IBM DB2嵌入SQL语言 35 3.1 一个简单示例 35 3.2 嵌入SQL语句 37 3.2.1宿变量 37 3.2.2单行查询 39 3.2.3多行查询 39 3.2.4插入、删除和修改操作 40 3.2.5 SQLCA 43 3.2.6事务 45 3.3 DB2的嵌入SQL程序处理过程 46 3.4 DB2的动态SQL嵌入语句 53 3.4.1 基本方法 53 3.4.2 动态游标 55 3.4.3 SQLDA 55 第四节 ORACLE数据库的嵌入SQL语言 66 4.1 基本的SQL语句 66 4.1.1宿变量和指示符 66 4.1.2 查询 68 4.1.3 修改数据 68 4.1.4 游标 68 4.2 嵌入PL/SQL 71 4.3 动态SQL语句 72 4.3.1 ORACLE动态SQL语句的一些特点 72 4.3.2 使用动态SQL的四种方法 72 4.3.3 SQLDA 75 第五节INFORMIX的嵌入SQL/C语言 89 5.1 一个简单的入门例子 89 5.2 宿变量 91 5.3 嵌入SQL的处理过程 96 5.4 动态SQL语言 96 5.4.1 SQLDA 97 第六节MICROSOFT SQL SERVER7嵌入式SQL语言 105 6.1 一个嵌入SQL语言的简单例子 105 6.2 嵌入SQL的处理过程 106 6.3 嵌入SQL语句 112 6.3.1 声明嵌入SQL语句中使用的C变量 112 6.3.2 连接数据库 115 6.3.3 数据的查询和修改 115 6.3.4 游标的使用 116 6.3.5 SQLCA 117 6.3.6 WHENEVER 118 6.4动态SQL语句 119 6.4 .1 动态修改 119 6.4.2 动态游标 120 6.4.3 SQLDA 122 6.4.4 DESCRIBE语句 130 6.5 API 130
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值