3.7 嵌入式 sql

28
3.7 3.7 嵌嵌嵌 嵌嵌嵌 SQL SQL 嵌 C 嵌 PL/1 嵌嵌嵌嵌嵌嵌嵌嵌嵌 嵌嵌嵌嵌嵌 一: EXEC SQL SQL 嵌嵌嵌 嵌 嵌嵌嵌 SQL 嵌嵌“ DROP TABLE Stud ent” 嵌嵌嵌嵌嵌嵌嵌 EXEC SQL DROP TABLE Student

Upload: rich

Post on 21-Mar-2016

107 views

Category:

Documents


15 download

DESCRIPTION

3.7 嵌入式 SQL. 以 C 或 PL/1 作为主语言的嵌入式一般形式为: EXEC SQL〈SQL 主语句 〉 例 将下面一条 SQL 语句“ DROP TABLE Student” 嵌入到程序中为: EXEC SQL DROP TABLE Student ;. 3.7.2 嵌入式语句与主语言之间的通信. 数据库工作单元与源程序之间的通信包括: 1 向主语言传递 SQL 语句的之间的状态信息,使主语言能够控制此程序流程 2 主语言向 SQL 语句提供参数 3 将 SQL 语句查询数据库的结果交主语言进一步处理. 1 SQL 通信区 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 3.7 嵌入式 SQL

3.73.7 嵌入式嵌入式 SQLSQL

以 C 或 PL/1 作为主语言的嵌入式一般形式为:EXEC SQL 〈 SQL 主语句〉例 将下面一条 SQL 语句“ DROP TABL

E Student” 嵌入到程序中为:EXEC SQL DROP TABLE Student ;

Page 2: 3.7 嵌入式 SQL

3.7.2 3.7.2 嵌入式语句与主语言之嵌入式语句与主语言之间的通信间的通信数据库工作单元与源程序之间的通信包括:1 向主语言传递 SQL 语句的之间的状态信息,使主语言能够控制此程序流程2 主语言向 SQL 语句提供参数3 将 SQL 语句查询数据库的结果交主语言进一步处理

Page 3: 3.7 嵌入式 SQL

1 SQL 通信区包括描述系统当前工作状态和运行环境的各种数据,将送到 SQL 通信区 SQLC

A 。 应用程序从中取出这些状态信息,据此决定接下来执行的语句。2 主变量嵌入式语句可以使用主语言的程序变量来输入或输出数据。主语言程序变量简称主变量

Page 4: 3.7 嵌入式 SQL

3 游标下面给出嵌入 SQL 的一小段 C 程序:exec sql include sqlca;exec sql begin declare section; char title-id(7); char title(81); int royalty

Page 5: 3.7 嵌入式 SQL

Exec sql end declare section;main(){ exec sql declare c1 cursor for select tit-id,roy from titles; exec sql open c1; for(;;) { exec sql fetch c1 into :title-id,title,:royalty

Page 6: 3.7 嵌入式 SQL

If (sqlca.sqlcode<> success) break; printf(“title id:%royalty:%d,:title-id,royal

ty); printf(“title:%s”,title);exec sql close c1;

Page 7: 3.7 嵌入式 SQL

3.7.33.7.3 不用游标的不用游标的 SOLSOL 语句语句说明性语句数据定义语句数据控制语句查询结果为单记录的 SELECT 语句非 CURRENT 形式的 UPDATE非 CURRENT 形式的 DELETEINSERT 语句

Page 8: 3.7 嵌入式 SQL

11 。说明性语句。说明性语句格式:EXEC SQL BEGIN DECLARE SECTION

主变量的说明;EXEC SQL END DECLARE SECTION ;

Page 9: 3.7 嵌入式 SQL

数据定义语句数据定义语句 例。 建立一个学生表 STUDENT 。 EXEC SQL CREATE TABLE Student (Sno CHAR(5) NOT NULL UN

IQUE Sname CHAR(20), Ssex CHAR(1), Sage INT, Sdept CHAR(15);

Page 10: 3.7 嵌入式 SQL

3.3. 数据控制语句数据控制语句例 把查询 STUDENT 表权限授给用户 U1 。EXEC SQL GRANT SELECT ONTABLE STUDENT TO U1

Page 11: 3.7 嵌入式 SQL

44 。查询结果为单记录的。查询结果为单记录的 SELSELECTECT 语句语句

EXEC SQL SELECT [ALL DISTINCT] < 目标列表达式 > [, < 目标列表达式 > ] INTO < 主变量 >[< 指示变量 > ] [, <主变量 > [< 指示变量 > ] ] FROM < 表名或视图名 > [ WHERE < 条件表达式 >] [ GROUP BY < 列名 1 > [HAVING<条件表达式 > ] ] [ORDER BY < 列名 2 > [ASC DES

C] ] ;

Page 12: 3.7 嵌入式 SQL

注意注意 使用主变量前须加以说明,且引用时其前面要加冒号。 查询结果中某列为空时( NULL ),如果 INTO 子句中主变量后面跟有指示变量,系统自动为该指示变量赋一空值。 查询结果为空时, DBMS 将 SQLCODE 的值置为 100 。 查询结果非单条记录, SQLCA 中返回错误信息。

Page 13: 3.7 嵌入式 SQL

例。 根据学生号码查询学生信例。 根据学生号码查询学生信息息EXEC SQL SELECT Sno,Sname, Ssex,

Sage,Sdept INTO :Hsno,:H name ,:Hsex,:Hage,:Hdept FROM Student WHERE Sno= :givensno;

Page 14: 3.7 嵌入式 SQL

例 查询某个学生选修某门课程例 查询某个学生选修某门课程的成绩。的成绩。EXEC SQL SELECT Sno,Cno,Grade INTO :Hsno,:Hcno,:Hgrade:Gradeid FROM SC WHERE Sno= :givensnoAND Cno=:givencno;

Page 15: 3.7 嵌入式 SQL

5.5. 非非 CURRENTCURRENT 形式的形式的 UPDAUPDATETE 语句语句

将全体学生 1 号课程的成绩加若干分。EXEC SQL UPDATE SC SET Grade= Grade+:Raise WHERE Cno=‘1’;

Page 16: 3.7 嵌入式 SQL

例 将计算机系全体学生年龄置例 将计算机系全体学生年龄置空值(空值( NULLNULL )) Sageid= -1; EXEC SQL UPDATE Student SET Sage=:Raise:Sageid WHERE Sdept=‘CS’; 等价于: EXEC SQL UPDATE Student SET Sage = NULL WHERE Sdept=‘CS’;

Page 17: 3.7 嵌入式 SQL

66 。非。非 CURRENTCURRENT 形式的形式的 DELDELETEETE 语句语句

例 删除某个学生所有选课记录。 EXEC SQL DELETE FROM SC WHERE Sno= (SELECT Sno FROM Student WHERE Sname =:stdna

me

Page 18: 3.7 嵌入式 SQL

等价于:等价于:EXEC SQL DELETE FROM SC WHERE :stdname = (SELECT Sname FROM Student WHERE Student 。 Sno=SC.sno

Page 19: 3.7 嵌入式 SQL

7.INSERT 7.INSERT 语句语句INSERT 语句的 VALUES 子句可以使用主变量和指示变量。例 将某个学生某门课程的记录插入 SC表中。Gradeid=-1EXEC SQL INSERTINTO SC(Sno,Cno,Grade)VALUES(:stdno,:couno,:gr,:gradeid)

Page 20: 3.7 嵌入式 SQL

3.7.4 3.7.4 使用游标的使用游标的 SQLSQL 语句语句查询结果为多条记录的 SELECT 语句。CURRENT 形式的 UPDATE 语句。CURRENT 形式的 DELETE 语句。

Page 21: 3.7 嵌入式 SQL

查询结果为多条记录的查询结果为多条记录的 SELECSELECTT 语句语句

使用游标的步骤: 1 )。说明游标 EXEC SQL DECLARE 〈游标名〉 CURSOR FOR 〈 SELECT 语句〉; 2 )。打开游标 EXEC SQL OPEN 〈游标名〉; 3 )。推进游标指针并取当前记录。 EXEC SQL FETCH 〈游标名〉 INTO < 主变量 >[< 指示变量 > ] [, < 主变量 >

[< 指示变量 > ] ]

Page 22: 3.7 嵌入式 SQL

44 )。关闭游标)。关闭游标 EXEC SQL CLOSE 〈游标名〉 例 查询某个系全体学生的信息。 EXEC SQL BEGIN DECLARESECTION /* 说明主变量 deptname,Hsno,Hsname,Hsage 等。 */ EXEC SQL END DECLARE SECTION ;

Page 23: 3.7 嵌入式 SQL

get(deptname); EXEC SQL DECLARE SX CURSOR FOR SELECT Sno,Sname,Ssex,Sage FROM Student WHERE Sdept=:deptname; /* 说明游标 */ EXEC SQL OPEN SX /* 打开游标 */ WHILE ( 1 ) /* 用循环结构逐条处理结果集中的记录 */

Page 24: 3.7 嵌入式 SQL

{ EXEC SQL FETCH SX INTO : Hsno, :Hsname, :Hssex, :Hsage; /* 游标指针向前推进一行,取当前行送相 应主变量 */ if (sqlca.sqlcode<>SUCCESS) break; /* 若查询结束或出现 SQL 语句错误,则退出循环 */ } ;

Page 25: 3.7 嵌入式 SQL

EXEC SQL CLOSE SX ; / * 关闭游标 * / 例 查询某系全体学生的选课信息。 EXEC SQL BEGIN DECLARESECTION /* 说明主变量 deptname,Hsno,Hsname,Hsage 等。 */ EXEC SQL END DECLARE SECTION ;

Page 26: 3.7 嵌入式 SQL

EXEC SQL DECLARE SX CURSOR FOR SELECT Sno,Sname,Ssex,Sage FROM Student WHERE Sdept=:deptname; /* 说明游标 */ WHERE ( get(deptname)!=NULL) /* 接受主变量 deptname 的值 */

Page 27: 3.7 嵌入式 SQL

{ EXEC SQL OPEN SX WHILE ( 1 ) {

/* 用循环结构逐条处理结果集中的记录 EXEC SQL FETCH SX INTO : Hsno, :Hsname, :Hssex, :Hsage; /* 游标指针向前推进一行,取当前行送相 应主变量 */ if (sqlca.sqlcode<>SUCCESS) break; /* 若查询结束或出现 SQL 语句错误,则退出循环 */

Page 28: 3.7 嵌入式 SQL

Prinf(“% 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”,& NEW Age); EXEC SQL UPDATE Student SET Sage= :NEWAge WHERE CURRENT OF SX;