有一死党月光族,经常打电话来叫请吃饭。
于是有一次我接了电话就说:对不起您的手机已欠费。
停了几秒不知道后面怎么说,她不说话也没挂电话。然后我又说orry your cellular phone have no money
我反复说了几遍后,她突然冒了一句,你玩够没有。玩够了出来请我吃饭
数据库中的游标主要是用于嵌入式SQL里面,解决SQL的集合处理方式与主语言单记录处理方式之间的协调问题。
1、 嵌入式SQL定义:SQL不能提供屏幕控制、菜单管理、图像管理、报表生成等功能,这些只能通过C、Java等主语言实现,在主语言中使用SQL结构(嵌入在主语言的程序中使用的SQL)称为嵌入式SQL。
2、 嵌入式SQL的两种实现方式
a) 扩充主语言的编译程序,使之能处理SQL语句(很少用)
b) 采用预处理方式,是先用预处理程序对源程序进行扫描,识别出SQL语句,并处理成主语言的函数形式,然后再用主语言的编译程序编译成目标程序(目前多数系统采用的方式)
共享变量:数据库和主语言程序间的信息传递是通过共享变量实现的,这些共享变量用declare语句说明,共享变量是SQL和主语言的接口。SQL_STATE是一个特殊共享变量,起着解释语句执行状况的作用,它由5个字符组成的字符数组,全零表示成功,非全零表示各种错误。
3、 嵌入式SQL的使用规定
a) 在程序中要区分SQL语句和主语言语句
i. 所有主语言中的SQL语句必须加上标识“Exec SQL开始,End_EXEC结束”
ii. 嵌入的SQL语句的语法:
EXEC SQL <SQL语句> END_EXEC;
b) 允许嵌入的SQL语句引用主语言的程序变量(即共享变量)
i. 引用时,共享变量前必须加冒号:,作为前缀标识,以示与数据库中变量的区别;
ii. 共享变量要用SQL的Declare语句说明,语法:
EXEC SQL BEGIN DECLARE SECTION;
<共享变量定义>;
EXEC SQL END DECLARE SECTION;
c) SQL的集合处理方式与主语言单记录处理方式之间的协调
i. SQL语句处理的是记录集合,而主语言语句一次只能处理一个记录,所以需要用游标机制(cursor)来协调SQL和主语言之间的处理方式。在推进时沿查询结果中元组顺序从头到尾一行行推进,并且不能返回,这就是游标技术
ii. 游标定义语句(declare)
EXEC SQL DECLARE <游标名> CURSOR FOR <Select语句> END_EXEC
iii. 游标打开语句(open)
EXEC SQL
OPEN <游标名>
END_EXEC
iv. 游标推进语句(fetch)
EXEC SQL
FETCH FROM<游标名>INTO <变量表>
END_EXEC
v. 游标关闭语句(close)
EXEC SQL
CLOSE
<游标名>
END_EXEC
d) SQL的集合处理方式与主语言单记录处理方式之间的协调的增强版(卷游标的使用)
i. 为了解决游标不能返回的问题,SQL2中提供了卷游标,在推进时沿查询结果中元组可以进退自如。
ii. 卷游标定义语句(declare)
EXEC SQL
DECLARE <游标名> SCROLL CURSOR FOR
<Select语句>
END_EXEC
iii. 卷游标打开语句(open)
EXEC SQL
OPEN <游标名>
END_EXEC
iv. 卷游标推进语句(fetch)
EXEC SQL
FETCH
Next从当前位置推进一行
或Prior从当前位置返回一行
或First移向第一行
或Last移向最后一行
或Relative<整数>从当前位置推进n行,正数代表推进,负数代表返回或Absolute<整数>移向查询结果的第n行,正数代表正数,负数代表倒数
FROM<游标名>INTO <变量表> END_EXEC
v. 卷游标关闭语句(close)
EXEC SQL CLOSE <游标名>
END_EXEC
零测试