《2022年嵌入式SQL .pdf》由会员分享,可在线阅读,更多相关《2022年嵌入式SQL .pdf(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1 嵌入式 SQL 嵌入式 SQL 语言把 SQL 语言嵌入到某种高级语言中使用,利用高级语言的过程性结构来弥补 SQL 语言实现复杂应用方面的不足。这种方式下使用的SQL 语言称为嵌入式SQL(Embedded SQL ),而嵌入 SQL 的高级语言称为主语言或宿主语言。11 嵌入式 SQL 的一般形式对宿主型数据库语言SQL ,DBMS 可采用两种方法处理, 一种是预编译, 另一种是修改和扩充主语言使之能处理SQL 语句。目前采用较多的是预编译的方法。即由DBMS 的预处理程序对源程序进行扫描, 识别出 SQL 语句。把它们转换成主语言调用语句,以使主语言编译程序能识别它,最后由主语言的编
2、译程序将整个源程序编译成目标码。在嵌入式 SQL 中,为了能够区分SQL 语句与主语言语句,所有SQL 语句都必须加前缀 EXEC SQL. 。SQL 语句的结束标志则随主语言的不同而不同。例如在 PL/1 和 C 中以分号(;)结束;EXEC SQL ;在 COBOL 中以 END-EXEC 结束;EXEC SQL END-EXEC 例如 一条交互形式的 SQL 语句: DROP TABLE Student ;嵌入到 C 程序中,应写成:EXEC SQL DROP TABLE Student ;嵌入 SQL 语句根据其作用的不同, 可分为 可执行语句 和说明性语句 两种。可执行语句又分为数据
3、定义 ,数据控制 ,数据操纵 三种。在宿主程序中,任何允许出现可执行的高级语言语句的地方,都可以写可执行 SQL 语句 ;任何允许出现说明型高级语言语句的地方,都可以写说明性SQL 语句。12 嵌入式 SQL 语句与主语言之间的通信将 SQL 嵌入到高级语言中混合编程,SQL 语句负责操纵数据库, 高级语言语句负责控制程序流程。这时程序中会含有两种不同计算模型的语句,一种是描述性的面向集合的SQL 语句,一种是过程性的高级语言语句,它们之间应该如何通信呢?数据库工作单元与源程序工作单元之间的通信主要包括:(1) 向主语言传递SQL 语句的执行状态信息,使主语言能够据此信息控制程序流程,主要用
4、SQL 通信区 (SQL Communication Area ,简称 SQLCA) 实现;(2) 主语言向 SQL 语句提供参数,主要用主变量实现;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 9 页 - - - - - - - - - 2 (3) 将 SQL 语句查询数据库的结果交主语言进一步处理,主要用主变量和游标 (Cursor )实现。一 SQL 通信区SQL 语句执行后,系统要反馈给应用程序若干信息,主要包括描述系统当前工作状态和运行环境的各种数据。这些信息
5、将送到SQL 通信区 SQLCA 种。应用程序从 SQLCA 中取出这些状态信息,据此决定接下来执行的语句。SQLCA 是一个数据结构,在应用程序中用EXEC SQL INCLUDE SQLCA 加以定义。 SQLCA 中有一个存放每次执行SQL 语句后返回代码的变量SQLCODE. 。应用程序每执行完一条 SQL 语句之后都应该测试一下SQLCODE的值,以了解 SQL 语句执行情况并作相应处理。 如果 SQLCODE等于预定义的常量SUCCESS ,则表示 SQL 语句成功,否则在 SQLCODE中存放错误代码。例如,在执行删除语句DELETE后,不同的执行情况SQLCA 中有下列不同的信
6、息:成功删除,并有删除的行数(SQLCODE = SUCCESS)无条件删除警告信息违反数据保护规则,拒绝操作没有满足条件的行,一行也没有删除由于各种原因,执行出错二 主变量嵌入式 SQL 语句中可以使用主语言的程序变量来输入或输出数据。我们把SQL 语句中使用的主语言程序变量简称为主变量 。主变量根据其作用的不同,分为输入主变量 和输出主变量 。输入主变量由应用程序对其赋值, SQL 语句引用;输出主变量由SQL 语句对其赋值或设置状态信息,返回给应用程序。一个主变量有可能既是输入主变量又是输出主变量。利用输入主变量,可以指定向数据库中插入的数据,可以将数据库中的数据修改为指定值,可以指定执
7、行的操作,可以指定 WHERE 子句或 HAVING子句中的条件。利用输出主变量,可以得到SQL 语句的结果数据和状态。所有主变量和指示变量(指示变量是一个整形变量,用来“指示“所指主变量的值或条件 ) 必 须 在 SQL语句 BEGIN DECLARE SECTION与 END DECLARESECTION之间进行说明。 说明之后,主变量可以在 SQL 语句中任何一个能够使用表达式的地方出现,为了与数据库对象名(表名,视图名,列名等)区别,SQL 语句中的主变量名前要加冒号(:)作为标志。同样, SQL 语句中的指示变量前也必须加冒号,并且要紧跟在所指主变量之后。 而在 SQL 语句之外,主
8、变量和指示变量均可以直接引用,不必加冒号。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 9 页 - - - - - - - - - 3 三游标SQL 语言与主语言具有不同的数据处理方式。SQL 语言是面向集合的, 一条 SQL 语句原则上可以产生或处理多条纪录。而主语言是面向纪录的,一组主变量一次只能存放一条纪录。所以仅使用主变量并不能完全满足SQL 语句向应用程序输出数据的要求,为此嵌入式SQL 引入了游标的概念,用游标来协调这两种不同的处理方式。游标是系统为用户可设
9、的一个数据缓冲区, 存放 SQL 语句的执行结果, 每个游标区都有一个名字。 用户可以通过游标逐一获取纪录。并赋给主变量,交由主语言进一步处理。EXEC SQL INCLUDE SQLCA END-EXEC. 定义 SQL 通信区01 ORA-WORKING-ITEMS. EXEC SQL BEGIN DECLARE SECTION END- EXEC .主变量说明开始05 ORA-USER PIC X(01) VALUE /. 05 TBL-WSGTMMPE. EXEC SQL INCLUDE WSGTMMPE.cpy END-EXEC. 05 S-WSGP83I. EXEC SQL INC
10、LUDE WSGQP83I.cpy END-EXEC. 05 KEY-SEC-CODE. 10 KEY-SEC-CODE1 PIC X(04). 10 KEY-SEC-CODE2 PIC X(01). 05 KEY-SEC-CD PIC X(14). EXEC SQL END DECLARE SECTION END- EXEC. .主变量说明结束EXEC SQL DECLARE SEL_PLACE CURSOR FOR S END-EXEC. 游标操作(定义游标)EXEC SQL OPEN SEL_PLACE END-EXEC. 游标操作(打开游标)EXEC SQL FETCH SEL_PLA
11、CE INTO . 游标操作(推进游标指针并将当前数据放入主变量)EXEC SQL CLOSE SEL_PLACEEND-EXEC. 游标操作(关闭游标 ) 13 不用游标的 SQL 语句名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 9 页 - - - - - - - - - 4 不用游标的 SQL 语句有:说明性语句数据定义语句数据控制语句查询结果为单纪录的SELECT语句非 CURRENT 形式的 UPDATE 语句非 CURRENT 形式的 DELETE 语句IN
12、SERT语句所有的说明性语句及数据定义与控制语句都不需要使用游标。它们是嵌入式 SQL 中最简单的一类语句,不需要返回结果数据,也不需要使用主变量。在主语言中嵌入说明性语句及数据定义与控制语句,只要给语句加上前缀EXEC SQL 和语句结束符即可。INSERT语句也不需要使用游标,但通常需要使用主变量。SELECT语句, UPDATE语句, DELETE 语句则要复杂些。一说明性语句说明性语句是专为在嵌入SQL 中说明主变量等而设置的,主要有两条语句:EXEC SQL BEGIN DECLARE SECTION ; 和EXEC SQL END DECLARE SECTION ; 两条语句必须配
13、对出现,相当于一个括号,两条语句中间是主变量的说明。二数据定义语句例 1 建立一个 ” 学生 ” 表 Student. EXEC SQL CREATE TABLE Student ( Sno CHAR(5) NOT NULL UNIQUE, Sname CHAR(20), Ssex CHAR(1) Sage INT, Sdept CHAR(15); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 9 页 - - - - - - - - - 5 EXEC SQL DROP
14、TABLE Student; 数据定义语句中不允许使用主变量。例如下列语句是错误的:EXEC SQL DROP TABLE :table_name; 三数据控制语句例 2把查询 Student 查询表权限授给用户U1. EXEC SQL GRANT SELECT ON TABLE Student TO U1; 四查询结果为单纪录的SELECT语句在嵌入式 SQL 中,查询结果为单纪录的SELECT语句需要用 INTO 子句指定查询结果的存放地点。该语句的一般格式为:EXEC SQL SELECT ALL|DISTINCT, . INTO ,FROM ,。 。 。 。 。 。WHERE GROU
15、P BY HAVING ORDER BY ASC|DESC; 该语句对交互式SELECT 语句的扩充就是多了一个INTO 子句。把 从数据库中找到的符合条件的纪录,放到INTO 子句指出的主变量中去。其他子句的含义不变。使用该语句需要注意以下几点:1INTO 子句,WHERE 子句的条件表达式, HAVING短语的条件表达式中均可以使用主变量。2查询返回的纪录中,可能某些列为空值NULL 。如果 INTO 子句中主变量后面跟有指示变量, 则当查询得出的某个数据项为空值时,系统会自动将相应主变量后面的指示变量置为负值,而不再向该主变量赋值,即主变量值仍为执行SQL语句之前的值。所以当指示变量值为
16、负值时,不管主变量为何值,均应认为主变量值为 NULL 。指示变量只能用于INTO 子句中。3如果数据库中没有满足条件的纪录,则DBMS 将 SQLCODE的值置为 100。4如果查询结果实际上并不是单条纪录,而是多条纪录,则程序出错,DBMS会在 SQLCA 中返回错误信息。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 9 页 - - - - - - - - - 6 例. 查询某个学生选修某门课程的成绩。假设已将要查询的学生的学号赋给了主变量givensno, 将课程
17、号赋给了主变量givencno. EXEC SQL SELECT Sno,Cno,Grade INTO :Hsno, :Hcno, :Hgrade:Gradeid FROM SC WHERE Sno=:givensno AND Cno=:givencno; 由于学生选修一门课后有可能没有参加考试,也就是说其成绩为空值, 所以在 INTO 子句中加了值是变量Gradeid ,用于指示主变量Hgrade是否为空值。执行此语句后,如果Gradeid 小于 0,则不论 Hgrade 为何值,均认为该学生成绩为空值。五非 CURRENT 形式的 UPDATE语句在 UPDATE语句中, SET 子句和
18、WHERE子句中均可以使用主变量,其中SET 子句中还可以使用指示变量。例 将全体学生 1 号课程的考试成绩增加若干分。假设增加的分数已赋给主变量Raise. EXEC SQL UPDATE SC SET Grade= Grade+:Raise WHERE Cno= 1 ; 六非 CURRENT 形式的 DELETE语句DELETE语句的 WHERE子句中可以使用主变量指定删除条件。例。某个学生退学了,现要将有关他的所有选课纪录删除掉。假设该学生的姓名已赋给主变量 stdname. EXEC SQL DELETE FROM SC WHERE Sno= (SELECT Sno FROM Stud
19、ent WHERE Sname=:stdname); 另一种等价实现方法为:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 9 页 - - - - - - - - - 7 EXEC SQL DELETE FROM SC WHERE :stdname= ( SELECT Sname FROM Student WHERE Student.Sno=SC.Sno ); 第 1 种方法更直接,从而也更高效些。七INSERT 语句INSERT语句的 VALUES 子句中可以使用主变量
20、和指示变量。14 使用游标的 SQL 语句必须使用游标的 SQL 语句有:查询结果为多条纪录的SELECT语句CURRENT 形式的 UPDATE语句CURRENT 形式的 DELETE语句一 查询结果为多条纪录的SELECT语句一般情况下, SELECT 语句查询结果都是多条纪录的,而高级语言一次只能处理一条纪录,因此需要用游标机制,将多条纪录一次一条送至宿主程序处理,从而把对集合的操作转换为对单个纪录的处理。使用游标的步骤为:1说明游标。用 DECLARE语句为一条 SELECT 语句定义游标。 DECLARE语句的一般形式为:EXEC SQL DECLARE CURSOR FOR ;其中
21、 SELECT 语句可以是简单查询,也可以是复杂的连接查询和嵌套查询。定义游标仅仅是一条说明性的语句,这时DBMS 并不执行 SELECT语句。2打开游标。用OPEN 语句将定义的游标打开。 OPEN 语句的一般形式为:EXEC SQL OPEN;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 9 页 - - - - - - - - - 8 打开游标实际上是执行相应的SELECT语句,把查询结果取到缓冲区中。 这时游标处于活动状态,指针指向查询结果集中第一条纪录。3. 推
22、进游标指针并取当前纪录。用FETCH语句把游标指针向前推进一条纪录,同时将缓冲区中的当前纪录取出来送至主变量供主语言进一步处理。FETCH 语句的一般形式为:EXEC SQL FETCH INTO , 。 。 。 。 。 ;其中主变量必须与SELECT语句中的目标列表达式具有一一对应关系。FETCH语句通常用在一个循环结构中, 通过循环执行 FETCH语句逐条取出结果集中的行进行处理 。4。关闭游标。用 CLOSE语句关闭游标,释放结果集占用的缓冲区及其他资源。CLOSE 语句的一般形式为:EXEC SQL CLOSE ;二CURRENT形式的 UPDATE语句和 DELETE语句UPDATE
23、语句和 DELETE语句都是集合操作,如果只想修改或删除其中某个纪录,则需要用带游标的SELECT 语句查出所有满足条件的纪录, 从中进一步找出要修改或删除的纪录,然后用 CURRENT形式的 UPDATE语句和 DELETE语句修改或删除之。具体步骤是:1用 DECLARE语句说明游标。 如果是为 CURRENT形式的 UPDATE语句做准备,则 SELECT语句中要用FOR UPDATE OF 用来指明检索出的数据在指定列是可修改的。如果是为CURRENT形式的 DELETE语句做准备,则不必使用上述子句。2用 OPEN 语句打开游标,把所有满足查询条件的记录从指定表取到缓冲区中。3用 F
24、ETCH语句推进游标指针,并把当前纪录从缓冲区中取出来送至主变量。4检查该纪录是否是要修改或删除的纪录。如果是, 则用 UPDATE语句或 DELETE语句修改或删除该纪录。这时UPDATE语句和 DELETE语句中要用子句WHERE CURRENT OF 来表示修改或删除的是最后一次取出的纪录,即游标指针指向的纪录。第 3,4 步通常用在一个循环结构中,通过循环执行FETCH语句,逐条取出结果集名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 9 页 - - - - -
25、- - - - 9 中的行进行判断和处理。5处理完毕用 CLOSE 语句关闭游标,释放结果集占用的缓冲区和其他资源。动态 SQL 简介嵌入式 SQL 语句为编程提供了一定的灵活性, 使用户可以在程序运行过程中根据实际需要输入 WHERE 子句或 HAVING子句中某些变量的值。 这些 SQL 语句的共同特点是,语句中主变量的个数与数据类型在预编译时都是确定的,只有主变量的值是程序运行过程中动态输入的,称这类嵌入式SQL 语句为静态 SQL 语句。动态 SQL 方法允许在程序运行过程中临时“组装”SQL 语句,主要有三种形式:1语句可变。允许用户在程序运行时临时输入完整的SQL 语句。2条件可变
26、。对于非查询语句,条件子具有一定的可变性。对于查询语句,SELECT子句是确定的,即语句的输出是确定的, 其他子句 (如 WHERE子句,HAVING短语)有一定的可变性,例如查询学生人数,可以是查询某个系的学生总人数 , 查 询 某个 年龄段 的学 生 人 数等 ,这 时 SELECT子 句的 目 标 列表 达式是 确定 的(COUNT(*) ),但 WHERE 子句的条件是不确定的。3数据库对象,查询条件均可变对于查询语句,SELECT子句中的列名,FROM 子句中的表名或视图名, WHERE子句和 HAVING短语中的条件等均可由用户临时构造,即语句的输入和输出可能都是不确定的。这几种动态形式几乎可覆盖所有的可变要求。为了实现上述三种可变形式,SQL 提供了相应的语句,例如EXECUTE IMMEDIATE, PREPARE, EXECUTE, DESCRIBE 等。使用动态 SQL 技术更多的是涉及程序设计方面的知识,而不是SQL 语言本身。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 9 页 - - - - - - - - -