1 / 28

CMU SSD7: Database Systems

CMU SSD7: Database Systems. Lu Wei School of Software Northwestern Polytechnical University. Unit2.2 Embedded SQL. 1. 嵌入式 SQL 简介 2. 嵌入式 SQL 语句与主语句之间的通信 3. 不用游标的 SQL 语句 4. 使用游标的 SQL 语句 5. 动态 SQL. 1. 嵌入式 SQL 简介. SQL 语言提供了三种不同的使用方式: 一种是在终端交互式方式下使用,我们前面介绍的就是做为独立语言由用户在交互环境下使用的 SQL 语言。

lance
Download Presentation

CMU SSD7: Database Systems

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CMU SSD7: Database Systems Lu Wei School of Software Northwestern Polytechnical University

  2. Unit2.2 Embedded SQL 1.嵌入式SQL简介 2.嵌入式SQL语句与主语句之间的通信 3.不用游标的SQL语句 4.使用游标的SQL语句 5.动态SQL Lu Wei

  3. 1.嵌入式SQL简介 • SQL语言提供了三种不同的使用方式: 一种是在终端交互式方式下使用,我们前面介绍的就是做为独立语言由用户在交互环境下使用的SQL语言。 第二种是将SQL语言嵌入到某种高级语言如PL/SQL、COBOL、FORTRAN、C中使用,利用高级语言的过程性结构来弥补SQL语言在实现复杂应用方面的不足,这种方式下使用的SQL语言称为嵌入式SQL(Embedded SQL),而嵌入SQL的高级语言称为主语言或宿主语言。 第三种是应用程序编程接口(API),如ODBC 当然这三种方式细节上会有许多差别,在程序设计的环境下,SQL语句要做某些必要的扩充。 Lu Wei

  4. 对宿主型数据库语言SQL,DBMS可采用两种方法处理:对宿主型数据库语言SQL,DBMS可采用两种方法处理: 一种是预编译,即由DBMS的预处理程序对源程序进行扫描,识别出SQL语句,把它们转换成主语言调用语句,以使主语言编译程序能识别它,最后由主语言的编译程序将整个源程序编译成目标码。目前采用较多的也是预编译的方法,如COBOL,C; 另一种是修改和扩充主语言使之能处理SQL语句,如PL/SQL。 Lu Wei

  5. 在嵌入式SQL中,为了能够区分SQL语句与主语言语句,所有SQL语句都必须加前缀EXEC SQL。SQL语句的结束标志则随主语言的不同而不同,例如在PL/1和C中以分号(;)结束,在COBOL中以END-EXEC结束。这样,以C或PL/1作为主语言的嵌入式SQL语句的一般形式为: 例: EXEC SQL<SQL语句>; EXEC SQL DROP TABLEStudent; Lu Wei

  6. 2.嵌入式SQL语句与主语句之间的通信 数据库工作单元与源程序工作单元之间通信主要包括: 1.向主语言传递SQL语句的执行状态信息,使主语言能够据此控制程序流程,主要用SQL通信区(SQL Communication Area,简称SQLCA)实现; 2. 主语言向SQL语句提供参数,主要用主变量(host variable)实现; 3. 将SQL语句查询数据库的结果交主语言进一步处理,主要用主变量和游标(cursor)实现 SQL通信区,主变量,游标的概念 Lu Wei

  7. EXEC SQL INCLUDE SQLCA; EXEC SQL BEGIN DECLARE SECTION; CHAR title_id(7);CHAR title(81);INT royalty;EXEC SQL END DECLARE SECTION;main(){ EXEC SQL DECLARE C1 CURSOR FOR SELECT tit_id,tit,roy FROM titles; EXEC SQL OPEN C1; (1)定义SQL通信区 (2)说明主变量 (3) 游标操作(定义) (4) 游标操作(打开) Lu Wei

  8. for(;;) { EXEC SQL FETCH C1 INTO :title_id, :title, :royalty; if (sqlca.sqlcode <> SUCCESS) break; printf("Title ID: %s, Royalty: %d", :title_id, :royalty); printf("Title:%s", :title); } EXEC SQL CLOSE C1; }      (5) 游标操作(推进游标指针,将当前数据放入主变量 ) (6) 利用SQLCA中的状态信息,决定何时退出循环 (7) 游标操作(关闭游标) Lu Wei

  9. 3.不用游标的SQL语句 不用游标的SQL语句有: • 说明性语句 • 数据定义语句 • 数据控制语句 • 查询结果为单记录的SELECT语句 • 非CURRENT形式的UPDATE语句 • 非CURRENT形式的DELETE语句 • INSERT语句 Lu Wei

  10. EXEC SQL BEGIN DECLARE SECTION; /*主变量说明*/ EXEC SQL END DECLARE SECTION; EXEC SQL CREATE TABLE Student (Sno CHAR(5) NOT NULL UNIQUE, Sname CHAR(20), Ssex CHAR(1), Sage INT, Sdept CHAR(15)); EXEC SQL DROP TABLE Student; EXEC SQL GRANT SELECT ON TABLE Student TO U1; Lu Wei

  11. 查询结果为单记录的SELECT语句 EXEC SQL SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>]...    INTO <主变量>[<指示变量>] [,<主变量>[<指示变量>]]...     FROM <表名或视图名>[,<表名或视图名>] ...    [WHERE <条件表达式>]    [GROUP BY <列名1>[HAVING <条件表达式>]]    [ORDER BY <列名2> [ASC|DESC]]; Lu Wei

  12. EXEC SQL SELECT Sno,Sname,Ssex,Sage,Sdept    INTO :Hsno,:Hname,:Hsex,:Hage,:Hdept    FROM Student    WHERE Sno=:givensno; EXEC SQL SELECT Sno, Cno, Grade    INTO :Hsno, :Hcno, :Hgrade:Gradeid    FROM SC    WHERE Sno=:givensno AND Cno=:givencno; Lu Wei

  13. 非CURRENT形式的UPDATE语句 EXEC SQL UPDATE SC    SET Grade=Grade+:Raise    WHERE Cno='1'; EXEC SQL UPDATE SC    SET Grade=:newgrade    WHERE Sno=:givensno; Sageid=-1; EXEC SQL UPDATE Student    SET Sage=:Raise:Sageid    WHERE Sdept='CS'; Lu Wei

  14. 非CURRENT形式的DELETE语句 EXEC SQL DELETE    FROM SC    WHERE Sno=        (SELECT Sno         FROM Student         WHERE Sname=:stdname); Lu Wei

  15. INSERT语句 gradeid=-1; EXEC SQL INSERT    INTO SC(Sno, Cno, Grade)    VALUES(:stdno, :couno, :gr:gradeid); Lu Wei

  16. 4.使用游标的SQL语句 必须使用游标的SQL语句有: • 查询结果为多条记录的SELECT语句 • CURRENT形式的UPDATE语句 • CURRENT形式的DELETE语句 Lu Wei

  17. 查询结果为多条记录的SELECT语句 例1 查询某个系全体学生的信息。要查询的系名由用户在程序运行过程中指定,放在主变量deptname中 ... EXEC SQL BEGIN DECLARE SECTION; ... /* 说明主变量 deptname,HSno,HSname,HSsex,HSage等*/ ... EXEC SQL END DECLARE SECTION; ... gets(deptname);   /* 为主变量deptname赋值 */ ... Lu Wei

  18. EXEC 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 <> SUCCESS) break; ... } EXEC SQL CLOSE SX; /* 关闭游标 */ ... Lu Wei

  19. CURRENT形式的UPDATE语句 例3 查询某个系全体学生的信息(要查询的系名由主变量deptname指定),然后根据用户的要求修改其中某些记录的年龄字段。 ... EXEC SQL BEGIN DECLARE SECTION; ... /* 说明主变量 deptname,HSno,HSname,HSsex,HSage等*/ ... EXEC SQL END DECLARE SECTION; ... gets(deptname);   /* 为主变量deptname赋值 */ ... Lu Wei

  20. EXEC SQL DECLARE SX CURSOR FOR    SELECT Sno, Sname, Ssex, Sage    FROM Student    WHERE SDept=:deptname; /* 说明游标 */ FOR UPDATE OF Sage; EXEC SQL OPEN SX  /* 打开游标 */ WHILE(1)  /* 用循环结构逐条处理结果集中的记录 */ { EXEC SQL FETCH SX INTO:HSno,:HSname,:HSsex,:Hsage; /* 游标指针向前推进一行,然后从结果集中取当前行,送相应主变量 */ if (sqlca.sqlcode <> SUCCESS) break; ... Lu Wei

  21. 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; /* 关闭游标 */ ... Lu Wei

  22. 5.动态SQL 如果在预编译时下列信息不能确定,我们就必须使用动态SQL技术: .SQL语句正文·主变量个数·主变量的数据类型·SQL语句中引用的数据库对象(例如列、索引、 基本表、视图等) Lu Wei

  23. EXECUTE IMMEDIATE语句 EXEC SQL BEGIN DECLARE SECTION; float increment; EXEC SQL END DECLARE SECTION; EXEC SQL UPDATE Staff SET salary=salary+:increment WHERE staffNo=‘SL21’; EXEC SQL BEGIN DECLARE SECTION; char buffer[100]; EXEC SQL END DECLARE SECTION; sprintf(buffer,”UPDATE Staff SET salary=salary+%f WHERE staffNo=‘SL21’”,increment;); EXEC SQL EXECUTE IMMEDIATE :buffer; Lu Wei

  24. Prepare和execute语句 预编译器 绑定应用程序 执行 编译时 运行时 (a)静态SQL 运行时 EXECUTE IMMEDIATE语句 EXECUTE PREPARE语句 解析语句 验证语句 优化语句 创建执行方案 执行语句 (b)动态SQL Lu Wei

  25. EXEC SQL BEGIN DECLARE SECTION; char buffer[100]; float newSalary; char staffNo[6]; EXEC SQL END DECLARE SECTION; SPRINTF(buffer,”update staff set salary=:sal where staffNo=:sn”); EXEC SQL PREPARE stmt FROM :buffer; Lu Wei

  26. do{ printf(“Enter staff number:”); scanf(“%s”,staffNo); printf(“Enter new salary:”); scanf(“%f”,newSalary); EXEC SQL EXECUTE stmt USING :newSalary,:staffNo; printf(“Enter another(Y/N)?”); scanf(“%c”,nore); } until(more!=‘Y’); Lu Wei

  27. SQL描述符域 • 上面通过占位符是向EXECUTE语句传递参数的一种方式;另一种方式是通过SQL描述符域(SQLDA)的动态数据结构实现。一般在不清楚占位符的数量和数据类型的情况下使用SQLDA。 Lu Wei

  28. ODBC Lu Wei

More Related