SQL标准介绍:嵌入式SQLcobol声明变量
2012-04-14 18:25 cobol inspect cobol视频 阅读(686) 评论(0) 编辑 收藏 举报嵌入式SQL(embeddedSQL)SQL语言可以作为语言在终端交互方式下直接调用,也可以被嵌入到某种特定的程序设计语言中,利用程序设计语言的过程性结构来弥补SQL语言实现复杂应用方面的不足。这种方式下使用的SQL语言称为嵌入式SQL,而嵌入SQL的程序设计语言则称为宿主语言。
SQL可以被嵌入到很多宿主语言中,SQL标准指定的标准宿主语言有Ada、C、COBOL、FORTRAN、MUMPS、Pascal和PL/I,并要求SQL实现必须至少支持其中一种。在嵌入SQL的宿主程序中,任何允许出现可执行的宿主语言语句的地方,都允许出现可执行的SQL语句;任何允许出现说明性宿主语言语句的地方,都允许出现SQL声明段。SQL声明段是声明宿主变量的地方,它以EXECSQLBEGINDECLARESECTION开始,以EXECSQLENDDECLARESECTION结束。
在使用标准程序设计语言编译器对宿主程序进行编译之前,需要对其进行预处理,将嵌入的SQL语句及宿主变量声明替换为宿主语言编译器能够识别的形式,这个过程称为预编译。为了能够区分SQL语句与宿主语言语句,所有的SQL语句前都必须加上SQL前缀(如EXECSQL),并以SQL终结符(如END-SQL)结束。
嵌入式SQL语句可以在任何可以放置标量表达式的地方含有宿主语言变量。宿主变量可以用来在程序和SQL数据之间传送数据。在SQL语句中,宿主变量必须前置一个冒号以同SQL对象名相区别。根据宿主变量的作用,可以将其分为输入变量、输出变量和符变量。输入变量用于向DBMS输入数据。输出变量用于接收从DBMS输出的数据。符变量是一个无符号数值型变量,当不能输入输出值可能为NULL值时,可以在相应的宿主变量后跟随一个宿主变量。对于输入宿主变量,任何小于0的符值的意思是传送的值为NULL,而任何符值大于等于0的意思是传送的是一个非空值;对于输入宿主变量,符值-1表示传送的值为NULL,而0表示传送的值为非空值。
由于SQL语言与宿主语言之间存在不匹配问题,即:SQL是在集合上操作,而宿主语言是在集合上操作。因此,SQL标准通过游标来解决上述问题。游标是对SQL数据进行操作的一种机制,通过它可以每次对表的一行进行操作。可以这样理解游标的作用:游标与一个SQL查询检索到的结果表相关联,它指向结果表中的一行,并且可以在结果表的行之间移动。当游标正指向某一行,即“定位”在这一行上时,可以使用UPDATE或DELETE语句的“定位”形式来UPDATE或DELETE这一行。为使游标正常地工作,通过需要包括四个动作:声明游标、打开游标、获取游标和关闭游标。分别由DECLARECURSOR语句、OPEN语句、FETCH语句和CLOSE语句实现。
SQL标准还提供了一套诊断机制,使得应用程序能够获知SQL语句的执行情况。基本的诊断信息项目为SQLSTATE。SQLSTATE是一个5字符变量,可以在SQL声明段中定义。在每个SQL语句之后,DBMS会将一个值(状态代码)放入SQLSTATE。状态代码由数字和字母构成。前两个数字或字母是“类”,描述状态的一般类别;SQL标准介绍:嵌入式SQLcobol声明变量接下来的三个数字或字母是“子类”,表示进一步的状态信息。例如:类“00”表示“SUCCESS”;类“01”表示“WARNING”;类“02”表示“NODATA”;其它类表示“ERROR”等。此外,通过GETDIAGNOSTICS语句还可以得到更详细的语句执行信息。
以下是一个嵌入式C程序范例,该程序检索表tab_1中的列col_1并将每一行中该列的值显示在屏幕上。
#include<stdio.h>
EXECBEGINDECLARESECTION;
intx;/输出宿主变量/
intx_indicator;/符变量/
EXECSQLENDDECLARESECTION;
inti;
voidmain()
{
EXECSQLCONNECTTOdb_serverUSERuser_1;/连接数据库/
EXECSQLDECLAREcur_1CURSORFORSELECTcol_1FROMtab_1;
EXECSQLOPENcur_1;
for(;;){
EXECSQLFETCHcur_1INTO:xINDICATOR:x_indicator;
if(!strncmp(SQLSTATE,”02000”,5))
break;/如果没有返回数据,则跳出循环/
if(x_indicator<0)
printf(“NULL\n”);
else
printf(“%d\n”,x);
}
cobol声明变量EXECSQLCLOSEcur_1;
EXECSQLDISCONNECTdb_server;
}