欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 » 关系数据库基础教程 » 正文

嵌入式SQL与动态SQL语句

创建时间:2012年06月02日 11:01  阅读次数:(8190)
分享到:
SQL语言有两种使用方式:一种是在终端交互方式下使用,称为交互式SQL;另一种是嵌入在高级语言的程序中使用,称为嵌入式SQL,而这些高级语言可以是C、ADA、PASCAL、COBOL或PL/I等,称为宿主语言。

本章主要讲解以下4点知识:
1 SQL的运行环境
2 嵌入式SQL的使用规定
3 嵌入式SQL的使用技术
4 动态SQL语句

SQL的运行环境
宿主语言十嵌入式SQL

预处理程序

宿主语言十函数调用

SQL函数定义库

宿主语言编译程序

目标程序

嵌入式SQL的使用规定
在程序中要区分SQL语句与宿主语言语句
允许嵌入的SQL语句引用宿主语言的程序变量(称为共享变量),但有两条规定:
(1) 引用时,这些变量前必须加冒号“:”作为前缀标识,以示与数据库中变量有区别。
(2) 这些变量由宿主语言的程序定义,并用SQL的DECLARE语句说明。

SQL的集合处理方式与宿主语言单记录处理方式之间的协调。
(1) 游标定义语句(DECLARE)。
(2) 游标打开语句(OPEN)。
(3) 游标推进语句( FETCH )。
(4) 游标关闭语句(CLOSE)。

嵌入式SQL的使用技术
1,不涉及游标的SQL DML语句
2,涉及游标的SQL DML语句
3,卷游标的定义和推进

涉及游标的SQL DML语句
(1)SELECT语句的使用方式
当SELECT语句查询结果是多个元组时,此时宿主语言程序无法使用,一定要用游标机制把多个元组一次一个地传送给宿主语言程序处理。
(2)对游标指向元组的修改或删除操作
在游标处于活动状况时,可以修改或删除游标指向的元组。

动态SQL语句
1,动态SQL预备语句
EXEC SQL PREPARE〈动态SQL语句名〉FROM〈共享变量或字符串〉
这里共享变量或字符串的值应是一个完整的SQL语句。这个语句可以在程序运行时由用户输入才组合起来。此时,这个语句并不执行。

2,动态SQL执行语句
EXEC SQL EXECUTE〈动态SQL语句名〉
动态SQL语句使用时,还可以有两点改进:
(1)当预备语句中组合而成的SQL语句只需执行一次时,那么预备语句和执行语句可合并成一个语句:
EXEC SQL EXECUTE IMMEDIATE〈共享变量或字符串〉
(2)当预备语句中组合而成的SQL语句的条件值尚缺时,可以在执行语句中用USING短语补上:
EXEC SQL EXECUTE < 动态SQL语句名 > USING <共享变量> 

例3.33  下面两个C语言的程序段说明了动态SQL语句的使用技术。
①EXEC SQL BEGIN DECLARE SECTION;
char *query;
EXEC SQL END DECLARE SECTION;
scanf(〞%s〞,query);/* 从键盘输入一个SQL语句 */
EXEC SQL PREPARE que FROM :query;
EXEC SQL EXECUTE que;
这个程序段表示从键盘输入一个SQL语句到字符数组中;字符指针query指向字符串的第1个字符。
如果执行语句只做一次,那么程序段最后两个语句可合并成一个语句:
EXEC SQL EXECUTE IMMEDIATE :query;

②char *query ="UPDATE sc
SET grade = grade * 1.1
WHERE c# = ?";
EXEC SQL PREPARE dynprog FROM :query;
char cno[5] = 〞C4〞;
EXEC SQL EXECUTE dynprog USING :cno;
这里第一个char语句表示用户组合成一个SQL语句,但有一个值(课程号)还不能确定,因此用“?”表示。第二个语句是动态SQL预备语句。第三个语句(char语句)表示取到了课程号值。第四个语句是动态SQL执行语句,“?”值到共享变量cno中取。

小结
SQL是关系数据库的标准语言,已广泛应用在商用系统中。
SQL的数据定义部分包括对SQL模式、基本表、视图、索引的创建和撤消。
SQL的数据操纵分成数据查询和数据更新两部分。
SQL的数据查询是用SELECT语句实现,兼有关系代数和元组演算的特点。
SQL的数据更新包括插入、删除和修改等三种操作,在视图中只有行列子集视图是可以更新的。
嵌入式SQL涉及到SQL语句的宿主语言程序中的使用规定,以解决两种语言的不一致和相互联系的问题。同时还介绍了动态SQL语句。

本章重要内容分析
SELECT语句是SQL的核心内容,对于该语句考生应掌握下列内容。
1.SELECT语句的来历
在关系代数中最常用的式子是下列表达式:
πA1,…,An(σF(R1×…×Rm))
这里R1、…、Rm为关系,F是公式,A1、…、An为属性。
针对上述表达式,SQL为此设计了SELECT—FROM—WHERE句型:
SELECT  A1,…,An FROM  R1,…,Rm WHERE  F
这个句型是从关系代数表达式演变来的,但WHERE子句中的条件表达式F要比关系代数中公式更灵活。

2.SELECT语句中出现的基本表名,应理解为基本表中的元组变量,而列名应理解为元组分量。

3.SELECT语句的语义有三种情况,下面以学生表S(S#,SNAME,AGE,SEX)为例说明。
第一种情况:SELECT语句中未使用分组子句,也未使用聚合操作,那么SELECT子句的语义是对查询的结果执行投影操作。譬如:
SELECT S#,SNAME FROM S WHERE SEX='M';

第二种情况:SELECT语句中未使用分组子句,但在SELECT子句中使用了聚合操作,此时SELECT子句的语义是对查询结果执行聚合操作。譬如:
SELECT COUNT(*),AVG(AGE) FROM S WHERE SEX='M'; 
该语句是求男同学的人数和平均年龄。

第三种情况:SELECT语句使用了分组子句和聚合操作(有分组子句时必有聚合操作),此时SELECT子句的语义是对查询结果的每一分组去做聚合操作。譬如:
SELECT AGE,COUNT(*) FROM S WHERE SEX='M' GROUP BY AGE;
该语句是求男同学每一年龄的人数。

4.SELECT语句中使用分组子句的先决条件是要有聚合操作。但执行聚合操作不一定要用分组子句。譬如求男同学的人数,此时聚合值只有一个,因此不必分组。
但同一个聚合操作的值有多个时,必须使用分组子句。譬如求每一年龄的学生人数。此时聚合值有多个,与年龄有关,因此必须分组。游标指向的元组。
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf】

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 87+11=? 的结果(结果是:98)
结  果: