《数据库概论》 第八章 数据库编程

8.1 嵌入式SQL

SQL语言提供两种不同使用方式:交互式、嵌入式

SQL语言是非过程性语言,事务处理应用需要高级语言,所以引入嵌入式SQL

8.1.1 嵌入式SQL的处理过程

嵌入式SQL是将SQL语言嵌入到程序设计语言中,被嵌入语言称为宿主语言或主语言,处理过程采用预编译方法。

为了区分SQL语句和主语言语句,所有SQL语句必须加入前缀EXEC SQL

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

SQL语句:

  • 描述性面向集合语句
  • 负责操纵数据库

高级语言语句:

  • 过程性地面向记录语句
  • 复制控制逻辑流程

数据库工作单元与源程序工作单元之间的通信:

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

1.SQL通信区

SQLCA是一个数据结构:

  • SQL语句执行后,系统反馈给应用程序信息
  • 将信息送到SQL通信区中
  • 应用程序从SQL通信区取出状态信息,并据此决定接下来的执行语句
定义SQLCA
 用EXEC SQL INCLUDE SQLCA定义

使用SQLCA
SQLCA中有一个存放每次执行SQL语句后返回代码的变量SQLCODE
如果SQLCODE等于预定义的常量SUCCESS,则表示SQL语句成功,否则表示出错
应用程序每执行完一条SQL语句之后都应该测试一下SQLCODE的值,以了解该SQL语句执行情况并做相应处理

2.主变量

嵌入式SQL语句中可以使用主语言的程序变量来输入或输出数据

在SQL语句中使用的主语言程序变量称为主变量

主变量类型:输入主变量、输出主变量

指示变量(整型变量):指示输入主变量是否为空值、检测输出变量是否为空置,值是否被截断

使用主变量
    说明之后的主变量可以在SQL语句中任何一个能够使用表达式的地方出现
    为了与数据库对象名(表名、视图名、列名等)区别,SQL语句中的主变量名前要加冒号(:)作为标志

使用指示变量
    指示变量前也必须加冒号标志
    必须紧跟在所指主变量之后

3.游标

SQL语言面向集合,一条语句原则可以产生或处理多条记录

主语言面向记录,一组主变量只能存放一条记录

嵌入式SQL引入游标概念来协调这两种不同处理方式

游标:

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

4.建立和关闭数据库连接

1)建立数据库连接 
EXEC SQL CONNECT TO target[AS connection-name][USER user-name]; 

target是要连接的数据库服务器
常见的服务器标识串,如<dbname>@<hostname>:<port> 
包含服务器标识的SQL串常量 
DEFAULT  

connect-name是可选的连接名,连接名必须是一个有效的标识符 
在整个程序内只有一个连接时可以不指定连接名
程序运行过程中可以修改当前连接 
EXEC SQL SET CONNECTION connection-name|DEFAULT;

(2)关闭数据库连接 
	EXEC SQL DISCONNECT [connection];

5.程序实例

依次检查某个系的学生记录,交互式更新某些学生年龄。
EXEC SQL BEGIN DECLARE SECTION;    /*主变量说明开始*/ 
	char Deptname[20];
	char Hsno[9];
	char Hsname[20]; 
	char Hssex[2];
	int HSage;
	int NEWAGE;
EXEC SQL END DECLARE SECTION;       /*主变量说明结束*/
long SQLCODE;
EXEC SQL INCLUDE SQLCA;               /*定义SQL通信区*/

int main(void)                           		/*C语言主程序开始*/
{
	int  count = 0;
	char  yn;                              		/*变量yn代表yes或no*/
	printf("Please choose the department name(CS/MA/IS): "); 
	scanf("%s",deptname);                 	/*为主变量deptname赋值*/
	EXEC SQL CONNECT TO TEST@localhost:54321 USER
                           "SYSTEM"/"MANAGER";         /*连接数据库TEST*/
	EXEC SQL DECLARE SX CURSOR FOR      /*定义游标SX*/
		SELECT Sno,Sname,Ssex,Sage     /*SX对应的语句*/
		FROM Student
		WHERE SDept = :deptname;
	EXEC SQL OPEN SX;       /*打开游标SX,指向查询结果的第一行*/

8.1.3 不用游标的SQL语句

不使用游标SQL语句种类:说明性语句、数据定义语句、数据控制语句、查询结果为单记录的SELECT语句、非CURRENT形式的增删改语句

1.查询结果为单记录的SELECT语句

EXEC SQL SELECT Sno,Sname,Ssex,Sage,Sdept  
INTO:Hsno,:Hname,:Hsex,:Hage,:Hdept
FROM  Student
WHERE Sno=:givensno;
	 /*把要查询的学生的学号赋给为了主变量givensno*/

2.非CURRENT形式的增删改语句

面向集合操作,一次修改或删除所有满足条件记录

EXEC SQL UPDATE SC
SET Grade=:newgrade
/*修改的成绩已赋给主变量:newgrade*/
WHERE Sno=:givensno;
/*学号赋给主变量:givensno*/

8.1.4 使用游标的SQL语句

1.查询结果为多条记录的SELECT语句

①说明游标

EXEC SQL DECLARE <游标名> CURSOR
FOR <SELECT语句>;

说明性语句,未执行SELECT

②打开游标

EXEC SQL OPEN <游标名>;

执行SELECT语句,查询结果取到缓冲区

③推进游标指针并取当前记录

EXEC SQL FETCH <游标名> 
INTO <主变量>[<指示变量>]
 [,<主变量>[<指示变量>]]...;

④关闭游标

EXEC SQL CLOSE <游标名>;

2.CURRENT形式的UPDATE和DELETE语句


8.1.5 动态SQL

  • 静态嵌入式SQL
  • 动态嵌入式SQL:程序运行中“组装”SQL语句

1.使用SQL语句主变量

程序主变量包含的内容是SQL语句的内容

SQL语句主变量在程序执行期间可以设定不同的SQL语句,然后立即执行

2.动态参数

SQL语句中的可变元素

使用参数符号(?)表示该位置的数据在运行时设定

3.执行准备好的语句

8.2 过程化SQL

8.2.1 过程化SQL的块结构

8.2.2 变量和常量的定义

8.2.3 流程控制

①条件控制

②循环控制

③错误控制

8.3 存储过程和函数

8.3.1 存储过程

1.存储过程的优点

运行效率搞、降低客户机和服务器的通信量、方便实施企业规划

2.存储过程的用户接口

①创建存储过程

②执行存储过程

③修改存储过程

④删除存储过程

8.3.2 函数

函数和存储过程的异同:

  • 同:都是持久性存储模块
  • 异:函数必须指定返回的类型

①函数定义

②函数执行

③修改函数

*8.3.3 过程化SQL中的游标

  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值