数据库系统第八章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
另一种等价实现方法为: EXEC SQL DELETE FROM SC WHERE : Stdname = (SELECT Sname FROM Student WHERE Student.Sno=SC.Sno );
[例7]. 某个学生选修了某门课程,将有关记录插入SC表中,假设学 生学号已赋给主变量stdno, 课程号已赋主变量couno. gradeid=-1; EXEC SQL INSERT
EXEC SQL <SQL语句> END-EXEC
例如一条交互式的SQL语句: DROP TABLE Student; 嵌入到C程序中,应写作: EXEC SQL DROP TABLE Student;
8.1.2 嵌入式SQL语句与主语言之间的通信
数据库工作单元与源程序工作单元之间的通信主要有:
(1).向主语言传递SQL语句的执行状态信息.
一般格式为:
EXEC SQL SELECT [ALL| DISTINCT] <目标列表达式>[,<目标列表达式>]…
INTO<主变量>[<指示变量>][, <主变量>[<指示变量>]]… FROM <表名或视图名>[, <表名或视图名>]… [WHERE <条件表达式>] [GROUP BY <列名1>[HAVING <条件表达式>]] [ORDER BY <列名2>[ASC|DESC] ]; 使用该语句需要注意以下三点: [例2]. 根据学生号码查询学生信息,假设已将要查询的学生的 学号赋给了主变量Givensno. EXEC SQL SELECT Sno,Sname,Ssex,Sage, Sdept INTO :Hsno, :Hname, :Hsex, :Hage, :Hdept FROM Student WHERE Sno =: Givensno;
二. CURRENT 形式的 UPDATE 语句和DELETE语句 具体步骤: (1). 用DECLARE语句说明游标。 (2). 用OPEN 语句打开游标。 (3). 用FETCH 语句推进游标指针,并将当前记录从缓冲去中取出 来送至主变量。 (4). 检查该记录是否是要修改或删除的记录. (5). 处理完毕用CLOSE语句关闭游标. 补例4. 查询某个系全体学生的信息.(要查的系名由主变量 deptname指定),然后根据用户的要求修改其中某些记录的年龄字段. …… EXEC SQL BEGIN DECLARE SECTION; …../*说明主变量deptname,Hsno,Hsname,Shsex,Hsage等*/ EXEC SQL END DECLARE SECTION …… gets(deptname); …… EXCE SQL DECLARE SX CURSOR FOR SELECT Sno,Sname,Ssex,Sage FROM Student WHERE SDept=: deptname FOR UPDATE OF Sage;
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) ?”);
注意时间
第八章
数据库编程
8.1 嵌入式 SQL
8.1.1 嵌入式SQL的处理过程
在嵌入式SQL中, 为了能够区分SQL语句与主语言语句,所有SQL语句都必须 加前缀EXEC SQL。 SQL语句的结束标志则随主语言的不同而不同. 例如,在PL/1和C中以分号“;”结束: EXEC SQL <SQL语句>; 在COBOL中以END-EXEC结束:
2.关闭数据库连接 建立连接的ESQL语句是: EXEC SQL DISCONNECT [connection-name];
五、程序实例
…… EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; CHAR Sno(5); CHAR Cno(3); INT Grade; EXEC SQL END DECLARE SECTION; main() { EXEC SQL DECLARE C1 CURSOR FOR SELECT Sno, Cno, Grade FROM SC; EXEC SQL OPEN C1; FOR( ; ; ) { EXEC SQL FETCH C1 INTO:Sno,:Cno, :Grade; if (sqlca.sqlcode<>SUCCESS) break; printf(“Sno:%s,Cno:%s,Grade:%d”, :Sno,:Cno, :Grade); } EXEC AQL CLOSE C1; }
EXEC SQL CLOSE<游标名>;
补例3. 查询某个系全体学生的信息.要查的系名由用户在程序运 行过程中指定,存放在主变量deptname中. …… EXEC SQL BEGIN DECLARE SECTION; …../*说明主变量deptname,Hsno,Hsname,Shsex,Hsage等*/ EXEC SQL END DECLARE SECTION …… gets(deptname); …… EXCE SQL DECLARE SX CURSOR FOR SELECT Sno,Sname,Ssex,Sage FROM Student WHERE SDept=: deptname; EXEC SQL OPEN SX; WHILE(1) { EXEC SQL FETCH SX INTO:HSno,:HSname,:Hssex,:HSage; if(sqlca.sqlcode<>SUCCES) break; …… }; EXEC SQL CLOSE SX; …….
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 SET Sage=:NEWAGE WHERE CURRENT OF SX; } } EXEC SQL CLOSE SXLeabharlann Baidu EXEC SQL COMMIT WORK; EXEC SQL DISCONNECT TEST;
(2).主语句向SQL语句提供参数.
(3).将SQL语句查询数据库的结果交主语言处理.
一、SQL通信区 SQL通信区SQLCA 二、主变量 1. 输入主变量 2. 输出主变量 3. 指示变量 所有主变量和指示变量必须在SQL语句 BEGIN DECLARE SECYION 与 END DECLARE SECYION之 间进行说明. 三、游标
CHAR(5) NOT NULL UNIQUE , CHAR(20) , CHAR(1) , INT, CHAR(15));
补例2 把查询Student表的权限授予用户U1. EXEX SQL GRANT SELECT ON TABLE Student TO U1;
四. 查询结果为单记录的SELECT语句
(1). 说明游标 EXEC SQL DECLARE<游标名>CURSOR FOR <SELECT语句>;
(2). 打开游标
EXEC SQL OPEN<游标名>;
(3). 推进游标指针并取当前记录 EXEC SQL FETCH<游标名>
INTO<主变量>[<指示变量>[; <主变量>[<指示变量>]]…; (4). 关闭游标
五、程序实例
[例1] 依次检查某个系的学生记录,交互式更新某些学生年龄。
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; int main(void) { int count=0; char yn; printf(“please choose the department name(CS/MA/IS):”); scanf(“%s”, &deptname); EXEC SQL CONNECT TO TSET @localhost:54321 USER “SYSTEM”/”MANAGER”;
}
8.1.3 不用游标的SQL语句
一. 说明性语句
EXEC SQL BEGIN DECLARE SECYION EXEC SQL END DECLARE SECYION
二. 数据定义语句
补例1 建立一个“学生”表Student. EXEX SQL CREATE TABLE Student
(Sno Sname Ssex Sage Sdept 三. 数据控制语句
四、建立和关闭数据库连接
1.建立数据库连接
建立连接的ESQL语句是:
EXEC SQL CONNECT TO target [AS connection-name] [USER user-name];
程序运行过程中可以修改当前连接,对应的SQL语句为:
EXEC SQL SET CONNECTION connection-name | DEFAULT;
五. 非CURRENT 形式的增删改 语句
[例4] 修改某个学生选修1号课程的考试成绩. EXEC SQL UPDATE SC SET Grade=:newgrade WHERE Sno=:givensno;
[例5]. 把计算机科学系全体学生的年龄置NULL值. SAID=-1; EXEC SQL UPDATE Student SET Sage=:Raise:Sageid WHERE Sdpt=„CS‟; 它等价于:
INTO SC(Sno,Cno,Grade)
VALUES(:stdno,:couno,:gr:gradeid);
8.1.4 使用游标的SQL语句
必须使用游标SQL语句有:
●
查询结果为多条记录的SELECT 语句 CURRENT 形式的UPDATE语句 CURRENT 形式的DELETE语句
●
●
一. 查询结果为多条记录的SELECT 语句 使用游标的步骤:
EXEC SQL DECLARE SX CURSOR FOR SELECT Sno, Sname, Ssex,Sage FROM Student WHERE SDept=:deptname; EXEC SQL OPEN SX; for( ; ; ) { EXEC SQL FETCH SX INTO:HSno,:HSname, :HSsex;:HSage; if (sqlca.sqlcode!=0) break;
EXEC SQL UPDATE Student SET Sage=NULL WHERE Sdpt=„CS‟;
[例6]. 某个学生退学了,现要将有关他的所有选课记录删除掉.假 设该学生的姓名已赋给主变量Stdname. EXEC SQL DELETE FROM SC WHERE Sno= (SELECT Sno FROM Student WHERE Sname=:Stdname );
EXEC SQL OPEN SX; WHILE(1) { EXEC SQL FETCH SX INTO:HSno,:HSname,:Hssex,:HSage; if(sqlca.sqlcode<>SUCCES) break; printf(“%s, %s, %s, %d”,Sno,Sname,Ssex,Sage); printf(“UPDATE AGE? ”); scanf(“%c”,&yn); if(yn=„y‟ or yn=„Y‟) {printf(“INPUT NEW AGE:”); scanf(“%d”,&NEWAge); EXEC SQL UPDATE Student SET Sage=:NEWAge WHERE CURRENT OF SX; }; …… }; EXEC SQL CLOSE SX; …….