《数据库概论》 第八章 数据库编程
2024-01-10 06:11:13
8.1 嵌入式SQL
SQL语言提供两种不同使用方式:交互式、嵌入式
SQL语言是非过程性语言,事务处理应用需要高级语言,所以引入嵌入式SQL
8.1.1 嵌入式SQL的处理过程
嵌入式SQL是将SQL语言嵌入到程序设计语言中,被嵌入语言称为宿主语言或主语言,处理过程采用预编译方法。
为了区分SQL语句和主语言语句,所有SQL语句必须加入前缀EXEC SQL
8.1.2 嵌入式SQL语句与主语言之间的通信
SQL语句:
- 描述性面向集合语句
- 负责操纵数据库
高级语言语句:
- 过程性地面向记录语句
- 复制控制逻辑流程
数据库工作单元与源程序工作单元之间的通信:
- 向主语言传递SQL语句的执行状态信息,使主语言能够据此控制程序流程,主要用SQL通信区实现。
- 主语言向SQL语句提供参数,主要用主变量实现。
- 将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中的游标
文章来源:https://blog.csdn.net/hhhhhhhftj/article/details/135049386
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!