1)所有的SQL语句都必须加前缀EXEC SQL 2)SQL语句的结尾必须加结束标志( ; 或者 END EXEC) 即一般形式为 EXEC SQL < SQL语句>; 或者 EXEC < SQL语句> END EXEC
例: 使用嵌入式SQL语言删除Studnet表——–EXEC SQL drop table Student;
一:SQL语句的执行状态被放到SQL通信区(SQLCA),主语言通过 SQLCA中的SQL语言执行状态判断该如何进行下一步操作 二:主语言向SQL语句提供参数。主要用主变量实现 (主语言中使用的变量叫做一般变量,高级语言和SQL语句都需要使用的变量叫做主变量,它是用来作为参数从主语言传递给SQL语言) 三: SQL语句查询的结果通过主变量和游标传递给主语言
下面详细叙述各条标准:
一. SQL通信区(SQLCA) 1)用EXEC SQL INCLUDE SQLCA 进行定义 2)每执行完一条SQL语句应立即测试返回代码SQLCODE的值,以了解执行情况并做相应处理。因为SQLCA中存放的是最新的SQL语句的执行状态值,当运行了新的SQL语句时,会将上一条SQL语句的执行状态值覆盖掉
3)SQLCODE = 0: SQL语句执行成功,并有满足条件的记录 =100:SQL语句处理完最后一条满足条件的记录或数据库中没有满足条件的记录 < 0 : SQL语句执行出错
例:执行DELETE语句后,SQLCODE的不同返回值: =0:成功删除若干行 =100:没有满足条件的记录(语法和语意都正确) <0 :执行出错(语法错误或者语意错误或者where条件叙述错误) 注(返回值<0的其他情况): 1)当需要删除的记录被另一个关系表参照时,则数据库将拒绝删除操作,此时SQLCODE返回值也小于0 2)当delete操作时未指明删除条件,则数据库会给予无条件删除警告信息,此时SQLCODE的返回值也小于0。 3)当用户进行删除操作时,数据库由于系统资源分配不均,无法响应用户的操作请求时,也会使SQLCODE返回值小于0)
二. 主变量 1)主变量:SQL语句中使用的主语言程序变量 a.主变量必须在SQL语言BEGIN DECLARE SCETION 与 END DECLARE SECTION之间进行定义 b.主变量可在SQL语言中任何一个能够使用表达式的地方出现,且可以在主语言中使用 c.SQL语言中的主变量名使用前要加冒号 (:)作为标志,以此与数据库对象名加以区别 2)指示变量:指示主变量的值或条件 a)SQL语言中的指示变量使用前要加冒号 (:)作为标志,并紧跟在所指示主变量之后 b)SQL语言之外,主变量和指示变量可直接使用 三:游标 系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字。用户可通过游标逐一获取记录,并赋予主变量,交给主语言进一步处理。
下面举个例子帮助大家理解:
exec sql include sqlca; //数据通信区定义,定义完后用户可以查询SQLCODE的值exec sql begin declare section; //主变量定义 char Sno(5); char Cno(3); int Grade;exec sql end declare section; //主变量定义结束int main(){ exec sql declare c1 cursor for select Sno ,Cno,Grade from SC; //定义一个游标(数据缓冲区),其中存放select的结果集 exec sql open c1; //激活游标,即打开游标 for(;;){ exec sql fetch c1 into :Sno, :Cno, :Grade; //fecth即获取游标中的记录,首先获取第一条记录,然后自动地向下移动以获取第二条记录 if(sqlcode !=0) break; //当获取失败则退出 PRintf("Sno:%s,Cno:%s,Grade:%d/n",:Sno,:Cno,:Grade); } exec sql close c1; //关闭游标(数据缓冲区)}四:不用游标的SQL语句
说明性语句: exec sql begin declare section; exec sql end declare section; 数据定义语句: exec sql create… exec sql drop… 数据控制语句 exec sql grant… exec sql revoke… 查询结果为单记录的select语句 1)用into子句指定查询结果的存放变量 2)into子句,where子句,having短语中均可使用主变量 3)查询结果若为多条记录则程序出错
再举个例子: exec sql select Sno,Sname,Sage,Sdept into :Sno,:Sname,:Sage,:Sdept from SC where Sno=:givesno and Cno=:givecno; 所以在主语言中我们就可以对givesno和givecno进行赋值,以达到查询效果
非current形式的update语句 例1:exec sql update SC set Grade = Grade + :raise where Cno = ‘1’———–将选修了一号课程的学生的分数加上raise
例2:exec sql update Student set Sage = null where Sdept = ‘CS’ ——-此时是将所有的学生的年龄统一置为null,这个统一可以看做是一个整体,所以可以不使用游标方式,而当对于一个集合(非全部)进行操作时就必须使用游标方式了。 非current形式的delete语句 例:exec sql delete from SC where Sno = (select Sno from Student where Sname = :stdname)——–删除姓名为stdname的学生的所有SC表中的信息
五:使用游标的SQL语句
查询结果为多条记录的select语句 例:
exec sql begin declare section;...exec sql end declare section;...exec sql begin declare SX cursor forselect Sno,Sname,Sage,Ssex from Student where Sdept = :deptname; //select查询的结果一定是多个,所以必须使用游标 where(gets(deptname)!=null) { exec sql open SX; while(1) {exec sql fetch SX into :Sno,:Sname,:Sage,:Ssex; if(sqlcode = 100)//当数据读取结束,下一条语句返回了100(无法查询到满足条件的记录)则break, break; if(sqlcode<0){ printf("error/n"); break; }/*此处添加当读取数据成功后执行的代码*/ }exec sql close SX;current形式的update语句和delete语句 例:
exec sql begin declare section;...exec sql end declare section;...Gets(deptname); //接受用户输入放入deptname中exec sql declare SX cursor for select Sno,Sname,Sage,Ssex from Student where Sdept=:deptname for update of Sage; //声明游标的目的(for update of Sage),这个与后文中的where current of SX是成对出现的exec sql open SX;while(1){ exec sql fetch SX into :Sno,:Sname,:Sage,:Ssex; if(sqlcode!=0) break; printf("%s,%s,%d,%s/n",Sno,Sname,Sage,Ssex); }printf("Update age?/n");scanf("%c",&yn);if(yn = 'y' | yn ='Y'){ printf("input new age"); scanf("%d",&newage); exec sql update Student set Sage=:newage where current of SX;//currentof SX意味着SX游标当前指向的记录,即此时修改SX游标指向的那条记录的Sage };...}exsec sql close SX;新闻热点
疑难解答