目录
嵌入式SQL
主变量
不用游标的SQL语句
使用游标的SQL语句
动态SQL
过程化SQL
存储过程和函数
ODBC编程
EXEC SQL BEGIN DECLARE SECTION; /*主变量说明开始*/ char Deptname[20]; char Hsno[9]; char Hsname[20]; char Hssex[2]; int HSage; int NEWAGE; EXEC SQL END DECLARE SECTION; /*主变量说明结束*/ long SQLCODE; EXEC SQL INCLUDE SQLCA; /*定义SQL通信区*/
int main(void) /*C语言主程序开始*/ { int count = 0; char yn; /*变量yn代表yes或no*/ printf("Please choose the department name(CS/MA/IS): "); scanf("%s",deptname); /*为主变量deptname赋值*/ EXEC SQL CONNECT TO TEST@localhost:54321 USER "SYSTEM"/"MANAGER"; /*连接数据库TEST*/ EXEC SQL DECLARE SX CURSOR FOR /*定义游标SX*/ SELECT Sno,Sname,Ssex,Sage /*SX对应的语句*/ FROM Student WHERE SDept = :deptname; EXEC SQL OPEN SX; /*打开游标SX,指向查询结果的第一行*/ for ( ; ; ) /*用循环结构逐条处理结果集中的记录*/ { EXEC SQL FETCH SX INTO :HSno,:Hsname,:HSsex,:HSage; /*推进游标,将当前数据放入主变量*/ if (SQLCA.SQLCODE!= 0) /*SQLCODE != 0,表示操作不成功*/ break; /*利用SQLCA中的状态信息决定何时退出循环*/ if(count++ == 0) /*如果是第一行的话,先打出行头*/ printf("\n%-10s %-20s %-10s %-10s\n", "Sno“,"Sname“,"Ssex", "Sage"); printf("%-10s %-20s %-10s %-10d\n“, HSno,Hsname,Hssex,HSage); /*打印查询结果*/ printf(“UPDATE AGE(y/n)?”); /*询问用户是否要更新该学生的年龄*/ do{scanf("%c",&yn);} while(yn != 'N' && yn != 'n' && yn != 'Y' && yn != 'y’); if (yn == 'y' || yn == 'Y') /*如果选择更新操作*/ { printf("INPUT NEW AGE:"); scanf("%d",&NEWAGE); /*用户输入新年龄到主变量中*/ EXEC SQL UPDATE Student /*嵌入式SQL更新语句*/ SET Sage = :NEWAGE WHERE CURRENT OF SX; } /*对当前游标指向的学生年龄进行更新*/ } EXEC SQL CLOSE SX; /*关闭游标SX,不再和查询结果对应*/ EXEC SQL COMMIT WORK; /*提交更新*/ EXEC SQL DISCONNECT TEST; /*断开数据库连接*/
EXEC SQL SELECT Sno,Sname,Ssex,Sage,Sdept INTO:Hsno,:Hname,:Hsex,:Hage,:Hdept FROM Student WHERE Sno=:givensno; /*把要查询的学生的学号赋给为了主变量givensno*/
EXEC SQL SELECT Sno,Cno,Grade INTO :Hsno,:Hcno,:Hgrade:Gradeid /*指示变量Gradeid*/ FROM SC WHERE Sno=:givensno AND Cno=:givencno;
如果Gradeid < 0,不论Hgrade为何值,均认为该学生成绩为空值。
EXEC SQL UPDATE SC SET Grade=:newgrade /*修改的成绩已赋给主变量:newgrade*/ WHERE Sno=:givensno; /*学号赋给主变量:givensno*/
某个学生新选修了某门课程,将有关记录插入SC表中。假设插入的学号已赋给主变量stdno,课程号已赋给主变量couno。
gradeid=-1; /*gradeid为指示变量,赋为负值*/ EXEC SQL INSERT INTO SC(Sno,Cno,Grade) VALUES(:stdno,:couno,:gr :gradeid); /*:stdno,:couno,:gr为主变量*/ 由于该学生刚选修课程,成绩应为空,所以要把指示变量赋为负值
EXEC SQL DECLARE <游标名> CURSOR FOR <SELECT语句>;
EXEC SQL OPEN <游标名>;
EXEC SQL FETCH <游标名> INTO <主变量>[<指示变量>] [,<主变量>[<指示变量>]]…;
指定方向推动游标指针,同时将缓冲区中的当前记录取出来送至主变量供主语言进一步处理
EXEC SQL CLOSE <游标名>;
变量和常量的定义
流程控制
无
能同时访问不同的数据库
共享多个数据资源
工作原理
ODBC API
句柄及其属性
数据类型