您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > 第4章 关系数据库标准语言SQL4
14.7嵌入式SQLSQL语言提供了两种工作方式:交互式SQL、嵌入式SQL前面介绍的SQL,是作为独立的数据语言可以直接以交互的方式使用的,除此之外,SQL还可以作为子语言嵌入在宿主语言中使用,这里所说的宿主语言就是指我们常见的高级程序设计语言,如C、C++、Java等等。下边主要介绍SQL作为子语言嵌入在宿主语言中使用的一般方法。把SQL嵌入到宿主语言中使用必须要解决以下三个方面的问题:1.嵌入识别问题。宿主语言的编译程序不能识别SQL语句,所以首要的问题就是要解决如何区分宿主语言的语句和SQL语句。2.宿主语言与SQL语言的数据交互问题。SQL语句的查询结果必须能够交给宿主语言处理,宿主语言的数据也要能够交给SQL语句使用。3.语言的单记录与SQL的多记录的问题。宿主语言一般一次处理一条记录,而SQL常常处理的是记录(元组)的集合,这个矛盾必须解决。2宿主语言的编译系统不能识别SQL语句。解决这个问题的一般方法是,为SQL语句加一个特殊的前缀,在用宿主语言的编译系统编译源程序之前,首先由预编译系统将SQL语句转换为宿主语言的合法函数调用。常用的前缀格式是:EXECSQL如:EXECSQLINSERTINTO职工VALUES(“WH8”,“E20”,1560);下图示意了嵌入了SQL的应用程序的执行过程。嵌入了SQL语句的应用程序,首先要经过预编译转换成宿主语言源程序,接着由宿主语言的编译系统产生中间代码,然后根据中间代码、宿主语言函数库和SQL函数据库连接产生可执行程序,执行程序时由SQL语句通过DBMS访问数据库。应用程序预编译编译连接执行应用程序DBMS源程序SQL库函数宿主语言库函数中间代码可执行程序数据库(一)嵌入识别与预编译3(二)数据通信区与主变量在嵌入使用SQL语句的程序中,一般在程序的前部都要有一条:INCLUDESQLCA这里的SQLCA即是SQL与宿主语言的通信区,它类似于结构变量,各个分量分别反映SQL语句的各种执行状态。负责SQL语句与宿主语言语句数据交换的是主(Host)变量,这种变量既可以用在SQL语句中,又可以用在宿主语言语句中。本章首页本节首页上一页这种变量必须在DECLARESECTION中说明,说明的格式是:BEGINDECLARESECTION…主变量说明…ENDDECLARESECTION4经以上方式说明的主变量可以在SQL语句中使用,只是用在SQL语句中时,必须冠以冒号前缀,如:UPDATE仓库SET面积=:wh_areaWHERE仓库号=:whnumb;主变量用在宿主语言语句中时,和一般程序变量的使用方法是一样的。本章首页本节首页上一页下面是在C语言程序中说明主变量的例子:EXECSQLBEGINDECLARESECTIONcharwhnumb[5]charcity[12]intwh_areaEXECSQLENDDECLARESECTION;5(三)游标(Cursor)宿主语言一般只能在单记录方式下工作,即一次处理一个记录。而SQL语句的查询结果常常是一张表,它包含多个记录,为此需要用游标(Cursor)作为桥梁做一些特殊处理。与游标有关的命令共有四条:DECLARECURSOROPENFETCHCLOSE通过下面的介绍我们会发现游标类似于文件的概念,游标有时的含义是整个“文件”,有时的含义是指向某个记录的指针。下面我们通过具体的几条语句来理解游标的概念。定义游标的DECLARECURSOR语句的格式是:EXECSQLDECLARE游标名CURSORFORSELECT-查询块;该语句用SELECT-查询块定义一个游标(文件),它的内容是:SELECT-查询块的查询结果(多个记录组成的表)。6启动或打开游标(文件)的语句是OPEN,其格式是:EXECSQLOPEN游标名;该语句的功能是打开或启动指出的游标。该游标名是用DECLAERCURSOR语句已经定义好的。执行该语句意味着执行在DECLARECURSOR语句中定义的SELECT查询,并使游标(指针)指向查询结果的第一条记录。7读记录的FETCH语句的格式是:EXECSQLFETCH游标名INTO:主变量1,:主变量2…;该语句的功能是取出游标所指记录并送入主变量,同时向前拨动游标,使游标指向下一条记录。这里的游标必须是已经说明并打开了的,INTO后的主变量要与在DECLARECURSOR中SELECT的字段相对应。当查询结果为空,或游标已经指向查询结果集的结尾时,SQLCA.sqlcode的代码将为-1,说明游标没有指向新记录。关闭游标(文件)的CLOSE语句的格式是:EXECSQLCLOSE游标名;该语句的功能是关闭或停止指出的游标。与程序设计语言中的文件相对照,DECLARECURSOR相当于说明了一个文件,OPEN相当于打开文件,FETCH相当于读一条记录,CLOSE相当于关闭文件。EXECSQLDECLARE游标名CURSORFORSELECT-查询块;8学生(学号,姓名,性别,年龄,所在系)课程(课程号,课程名,学分)选课(学号,课程号,成绩)94.7.3嵌入式SQL的使用技术1.不涉及游标的SQLDML语句【例4.43】给出在C语言中不涉及游标的嵌入式SQLDML语句的使用例子。(1)在学生表中,根据共享变量sno的值查询学生的姓名、性别和年龄。EXECSQLSELECT姓名,性别,年龄INTO:name,:sex,:ageFROM学生WHERE学号=:sno;这里,sno、name、sex、age都是共享变量,已在主程序中定义,并用SQL的DECLARE语句说明,在使用时加上“:”作为标识,以区别数据库中的变量。主程序中已先赋值给sno,SELECT的查询结果(一条记录)送到共享变量name、sex、age中。10(2)在学生表中插入一条新纪录,数据已在相关的共享变量中。EXECSQLINSERT学生(学号,姓名,性别,年龄)VALUES(:sno,:name,:sex,:age);如果某个属性值未给出,则自动置为空值。(3)从选课表中删除一个学生的各个成绩,学号在共享变量sno中。EXECSQLDELETEFROM选课WHERE学号=:sno;(4)将所有学生的“MATHS”课程成绩增加某个值(在共享变量a中)。EXECSQLUPDATE选课SET成绩=成绩+:aWHERE课程号IN(SELECT课程号FROM课程WHERE课程名=‘MATHS’);112.涉及游标的SQLDML语句当SELECT语句的查询结果为多个元组时,宿主语言程序无法使用,所以一定要有游标机制将多个元组一次一个地传送给宿主语言程序进行处理。具体有以下步骤:①先用游标定义语句定义一个游标和某个SELECT语句对应。②游标打开后,处于活动状态,此时游标指向查询结果集的第一个元组前。③每执行一次FETCH语句,游标指向下一个元组,并把其值送到共享变量,供程序处理,如此反复,直到所有查询结果处理完毕。④最后关闭游标;关闭的游标也可以重新打开,与新的查询结果集相对应,在没有打开前不能使用。12【例4.44】在教学数据库中检索成绩不及格的学生信息(学号,姓名,课程,成绩),下面是该查询的一个C函数。#defineNO_MORE_TUPLES!(strcmp(SQLSTATE,“02000”))Voidsel(){EXECSQLBEGINDECLARESECTIONCharsno[5],sname[9],cname[11];Intg;CharSQLSTATE[6];EXECSQLENDDECLARESECTION;EXECSQLDECLAREscxCURSORFORSELECT学生.学号,姓名,课程名,成绩FROM学生,课程,选课WHERE学生.学号=选课.学号and课程.课程号=选课.课程号and成绩60;13EXECSQLOPENscx;While(1){EXECSQLFETCHFROMscxINTO:sno,:sname,:cname,:g;If(NO_MORE_TUPLES)break;Printf(“%s,%s,%s,%d\n”,sno,sname,cname,g);}EXECSQLCLOSEscx;}这里使用了C语言中的宏定义NO_MORE_TUPLES,表示查不到元组时,其值为1.在游标处于活动状态时,可以修改或删除游标指向的元组。14【例4.45】在上例中对成绩作如下处理:对不及格的成绩分别加10分,显示不及格的学生信息。修改while(1){…}语句为:While(1){EXECSQLFETCHFROMscxINTO:sno,:sname,:cname,:g;If(NO_MORE_TUPLES)break;EXECSQLUPDATE选课SET成绩=成绩+10WHERECURRENTOFscx;Printf(“%s,%s,%s,%d\n”,sno,sname,cname,g);}153滚动游标的定义和推进之前我们介绍的游标在推进时只能沿查询结果集中的元组顺序一行行推进,不能回退,这给使用带来不便。SQL2标准提供了滚动游标(ScrollCursor)技术,游标在推进时可以上下滚动,进退自如。(1)滚动游标的定义语句。DECLARE游标名SCROLLCURSEFORSELECT语句END_EXEC;与前面的游标定义语句比较,这里多了一个关键字“SCROLL”。滚动游标的打开和关闭语句与前面一样。16(2)滚动游标的推进语句。NEXTPRIORFIRSTEXECSQLFETCHLASTFROM游标名INTORELATIVE整数共享变量组ABSOLLUTE整数END_EXEC;其中:NEXT表示把游标从当前位置推进一行;PRIOR表示把游标从当前位置返回一行;17FIRST表示把游标移向查询结果集的第一行;LAST表示把游标移向查询结果集的最后一行。后两种句法举例说明:RELATIVE3表示把游标从当前位置推进3行。RELATIVE-5表示把游标从当前位置返回5行。ABSOLLUTE3表示把游标移向查询结果集的第3行。ABSOLLUTE-5表示把游标移向查询结果集的倒数第5行。18作业4.4p103学生(学号,姓名,性别,年龄,所在系)课程(课程号,课程名,学分)选课(学号,课程号,成绩)(1)-(9)
本文标题:第4章 关系数据库标准语言SQL4
链接地址:https://www.777doc.com/doc-3827996 .html