第八章 数据库
事实和数据型数据库

第八章事实和数值型数据库第一节事实和数值型数据库概述在现代化图书馆的电子资源建设中,各种类型数据库的发展已经为图书馆的服务手段带来了飞跃性的变革。
数据库从存储的内容上可分为目录文摘数据库、全文数据库、事实型数据库、数值型数据库。
在图书馆电子资源建设的初期,二次文献数据库曾发挥了全面快速检索文献的作用,是电子资源的主要组成部分。
但随着文献信息的日益膨胀,面对INTERNET 网络信息的纷繁庞杂,用户越来越需要准确、真实、适用、具体、能够直接回答问题的针对性强的信息。
因此以一次信息(包括全文、事实、图形、数值信息)为主的源数据库已经成为数据库发展的主流,并将成为图书馆电子资源的发展重点。
以上几章中着重介绍了学术性文献库,在本章中我们将就另外两种目前具有重要的发展前途的数值型数据库及事实型数据库做一个概述性的介绍。
3.1事实数据库的发展历史如果从利用计算机作数据处理的角度来讲,则处理事实数据要比处理书目数据早得多。
但作为数据集合的数据库来讲,书目数据库的发展要比事实数据库的发展早一些。
最早的数据库是50年代的存于磁带上的书目库。
第一个事实数据库产生于1967年,是由美国Data 公司根据与俄亥俄律师协会的合同建立的俄亥俄法律法令全文库,收录有全美50个州的法律法令。
1968年,美国的Data Resource Inc公司成为第一家重要的数值数据库服务公司。
在70年代初期,事实数据库发展比较缓慢,其速度远远不及文献数据库的发展速度。
但由于事实数据库直接向用户提供原始情报,或经过加工存贮的“纯情报”,比如商业经济方面的数值数据库,直接向用户提供物价、产品规格、产值等方面的数据。
因此,越来越深受用户的欢迎。
自70年代中期以后,事实数据库迅速发展,没过多久其速度便赶上和超过了文献数据库的发展。
据统计,在1975年,欧洲只有51个事实数据库。
但到1985年,则猛增到1063个,平均每两年增加一倍。
1983年,世界数据库的总数为1845个,比1975年增加了38倍。
第8章 数据库的安全与权限

掌握SQL Server 2005中的权限管理策略
2013年7月5日
第2页
数据库原理及应用案例教程
北京大学出版社
教学重点及难点
重点:
掌握SQL Server 2005中用户和角色的策略 掌握SQL Server 2005中的权限管理策略
难点:
掌握数据库安全控制的各种方法
2013年7月5日
第6页
2013年7月5日
数据库原理及应用案例教程
北京大学出版社
8.1 数据库安全控制机制
数据库的安全性是指保护数据库,以防止不合法的使用使数据泄密、
更改或破坏。是数据库管理员必须认真考虑的问题。具体来讲,数据库管 理员必须制定一套安全控制策略,一方面要保证那些合法用户可以登录到
数据库服务器中,并且能够实施数据库中各种权限范围内的操作;另一方
(2)在强制存取控制方法中,每一个数据对象被标以一定的密级,每
一个用户也被授予某一个级别的许可证。对于任意一个对象,只有具有 合法许可证的用户才可以存取。强制存取控制因此相对比较严格。
2013年7月5日
第11页
第八章 数据库管理(部分)

三、SQL中的完整性约束
1. 域完整性规则:定义属性的取值范围―-属性值约束。 包括:域约束子句、非空值约束、基于属性的检查子句。
①用“CREATE DOMAIN”语句定义新的域,并可出现CHECK子句。
例:
定义一个新的域DEPT,可用下列语句实现:
DEPT CHAR(20) DEFAULT „计算机软件’
二、完整性规则的组成与分类
1、每个规则由三部分组成:
①什么时候使用规则进行检查(规则的“触发条件”);
②要检查什么样的错误( “ 约束条件”或“谓词”);
③若检查出错误,该怎样处理( “ELSE子句”,即违反时 要做的动作)。 2、在关系数据库中,完整性规则可分为三类: ①域完整性规则:定义属性的取值范围; ②基本表约束; ③断言。
CREATE DOMAIN
CONSTRAINT
VALID_DEPT
/*域约束名字*/
CHECK(VALUE IN („计算机科学与技术’,„计算机软件’)); 允许域约束上的CHECK子句中可以有任意复杂的条件表达式。
②非空值约束(NOT NULL) 例: SNO char(4) NOT NULL ③基于属性的检查子句(CHECK): 例:CHECK (GRADE IS NULL) OR (GRADE BRTWEEN 0 AND 100)
教学重点:
检查点技术
并发操作、封锁带来的若干问题,并发调度的可串行化。
SQL中完整性约束的实现:断言、触发器技术。 安全性中的授权语句。
§1
事务的概念
一、事务的定义 形成一个逻辑工作单元的数据库操作的汇集, 称为事务(transaction)。
例:在关系数据库中,一个事务可以是一条SQL语句、
数据库系统概论习题集第八章数据库并发控制

数据库系统概论习题集第⼋章数据库并发控制第⼋章数据库并发控制 ⼀、选择题 1.为了防⽌⼀个⽤户的⼯作不适当地影响另⼀个⽤户,应该采取()。
A. 完整性控制B. 访问控制C. 安全性控制D. 并发控制 2. 解决并发操作带来的数据不⼀致问题普遍采⽤()技术。
A. 封锁B. 存取控制C. 恢复D. 协商 3.下列不属于并发操作带来的问题是()。
A. 丢失修改B. 不可重复读C. 死锁D. 脏读 4. DBMS普遍采⽤()⽅法来保证调度的正确性。
A. 索引B. 授权C. 封锁D. ⽇志 5.事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放,这是()。
A. ⼀级封锁协议B. ⼆级封锁协议C. 三级封锁协议D. 零级封锁协议 6.如果事务T获得了数据项Q上的排他锁,则T对Q()。
A. 只能读不能写B. 只能写不能读C. 既可读⼜可写D. 不能读也不能写 7.设事务T1和T2,对数据库中地数据A进⾏操作,可能有如下⼏种情况,请问哪⼀种不会发⽣冲突操作()。
A. T1正在写A,T2要读A B. T1正在写A,T2也要写A C. T1正在读A,T2要写A D. T1正在读A,T2也要读A 8.如果有两个事务,同时对数据库中同⼀数据进⾏操作,不会引起冲突的操作是()。
A. ⼀个是DELETE,⼀个是SELECT B. ⼀个是SELECT,⼀个是DELETE C. 两个都是UPDATE D. 两个都是SELECT 9.在数据库系统中,死锁属于()。
A. 系统故障B. 事务故障C. 介质故障D. 程序故障 选择题答案: (1) D (2) A (3) C (4) C (5) A (6) C (7) D (8) D (9) B ⼆、简答题 1. 在数据库中为什么要并发控制? 答:数据库是共享资源,通常有许多个事务同时在运⾏。
当多个事务并发地存取数据库时就会产⽣同时读取和/或修改同⼀数据的情况。
若对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的⼀致性。
数据库第8章习题参考答案

第8章习题参考答案2.求程序的运行结果(1)Public Sub 习题8_2_1()Dim i As IntegerDebug.Print Tab(10); "*"For i = 1 To 5Debug.Print Tab(10 - i); "*"; Spc(i - 1); "*"; Spc(i - 1); "*"Next iFor i = 4 To 1 Step -1Debug.Print Tab(10 - i); "*"; Spc(i - 1); "*"; Spc(i - 1); "*"Next iDebug.Print Tab(10); "*"End Subrun:***** * ** * ** * ** * ** * ** * ** * *****(2)Public Sub 习题4_2_2()Dim x, y, i As Doublex = 0: y = 0For i = 1 To 8If i Mod 2 <> 0 Thenx = x - iElsey = y + iEnd IfNextDebug.Print "i="; iDebug.Print "x="; xDebug.Print "y="; yEnd Subrun:x=-16y= 20(3)Public Sub习题4_2_3()Dim m, s, k As Doublem = 28s = 0k = 1Do While k <= Int(m / 2)If Int(m / k) = m / k ThenDebug.Print ks = s + kEnd Ifk = k + 1LoopDebug.Print "s="; sEnd Subrun:124714s= 28(4)Public Sub 习题8_2_4()Dim n, a1, a2, a3, i As Doublen = Val(InputBox("请输入n,要求n>=3"))If n <= 2 ThenExit SubEnd Ifa1 = 1a2 = 1Debug.Print a1; a2For i = 2 To n - 1a3 = a1 + a2a1 = a2a2 = a3Debug.Print a3NextEnd Sub1 12353.改错题(1)Public Sub 改错8_3_1()Dim i, n, s As Doublen = Val(InputBox("请输入n"))i = 2: s = 1Do While i <= ns = s + ii = i + 1LoopDebug.Print "S="; sEnd Sub(2)Public Sub 改错8_3_2_求分式多项和()Dim nm, n, k ,p As integerDim y As Doublenm = Val(InputBox("请输入计算公式1后面的项目数目个数")) n = 1: p = 1: y = 1Do While n <= nmk = 2 * n + 1p = p * (k - 1) * ky = y + ((-1) ^ n) / pn = n + 1LoopDebug.Print "y="; yEnd Sub4.编程题(1)用if……else语句编程Public Sub分段函数1()Dim x, y, z As Doublex = Val(InputBox("请输入x的值:"))y = Val(InputBox("请输入y的值:"))If x > y And y <> 0 Thenz = x / yElseIf x = y Thenz = x * y * Sgn(y)Elsez = x + yEnd IfDebug.Print "x="; xDebug.Print "y="; yDebug.Print "z="; zEnd Sub(1)用select case语句结构编程Public Sub分段函数2()Dim x, y, z, a As Doublex = Val(InputBox("请输入x"))y = Val(InputBox("请输入y"))a = y - xSelect Case aCase Is > 0z = x + yDebug.Print zCase 0z = x * y * Sgn(y)Debug.Print zCase ElseIf y <> 0 Thenz = x / yDebug.Print zElseDebug.Print "z没有值"End IfEnd SelectEnd Sub(2)Public Sub 求解一元二次方程()Dim a, b, c As IntegerDim d, x1, x2, x3, x4 As Doublea = Val(InputBox("请输入a的整型数:"))b = Val(InputBox("请输入b的整型数:"))c = Val(InputBox("请输入c的整型数:"))d = b * b - 4 * a * cIf d > 0 Thenx1 = (-b + Sqr(d)) / (2 * a)x2 = (-b - Sqr(d)) / (2 * a)Debug.Print "x1="; x1, "x2="; x2Else if d=0 thenx3 = -b / (2 * a)x4 = -b/ (2 * a)Debug.Print "x3=";x3Debug.Print "x4=";x4ElseDebug.Print "方程没有实数解"End IfEnd Sub(3--1)用无条件转向语句GOTO编程Public Sub 数字与星期的转换1()Dim num As Integer10 num = Val(InputBox("请输入整数值:")) If num = 0 ThenDebug.Print "这是星期日"ElseIf num = 1 ThenDebug.Print "这是星期一"ElseIf num = 2 ThenDebug.Print "这是星期二"ElseIf num = 3 ThenDebug.Print "这是星期三"ElseIf num = 4 ThenDebug.Print "这是星期四"ElseIf num = 5 ThenDebug.Print "这是星期五"ElseIf num = 6 ThenDebug.Print "这是星期六"ElseIf num = -1 ThenDebug.Print "程序运行结束"EndElseDebug.Print "输入数据错误!"GoTo 10End IfEnd Sub(3--2)Public Sub数字与星期的转换2 ()Dim x As IntegerDo While Truex = Val(InputBox("请输入数字"))If x = 0 ThenDebug.Print "这是星期日"Exit DoElseIf x >= 1 And x <= 6 ThenDebug.Print "这是星期" + Str(x)Exit DoElseIf x = -1 ThenExit DoElseMsgBox ("输入数据错误!")End IfLoopEnd Sub(4)Public Sub 行李重量计费()Dim an, cn, weight, s_w, distance, fee As Doublean = Val(InputBox("请输入成年人数量"))cn = Val(InputBox("请输入未成年人数量"))weight = Val(InputBox("请输入行李重量"))distance = Val(InputBox("请输入距离"))s_w = weight - 20 * an - 10 * cnIf s_w <= 0 Thenfee = 0ElseIf distance / 100 = Int(distance / 100) Thenfee = 0.2 * s_w * (distance / 100)Elsefee = 0.2 * s_w * (Int(distance / 100) + 1) End IfEnd IfDebug.Print feeEnd Sub(5)Public Sub 求自然数的多项式和()Dim n, s As Integers = 0For n = 1 To 10s = s + (s + n)NextDebug.Print "S=1+(1+2)+(1+2+3)+...+1+2+3+...+10)="; s End SubRun:S=1+(1+2)+(1+2+3)+...+1+2+3+...+10)= 2036Public Sub 求多项自然数阶乘的和()Dim s, t As SingleDim n As Integert = 1s = 0For n = 1 To 20t = t * ns = s + tNextDebug.Print "1!+2!+3!+...+20!="; sEnd SubRun:1!+2!+3!+...+20!= 2.561327E+18(6)Public Sub 既能被3整除又能被5整除正整数个数() Dim i, x As Integerx = 0For i =100 To 200If i / 3 = Int(i / 3) And i / 5 = Int(i / 5) ThenDebug.Print ix = x + 1End IfNextDebug.Print "x="; xEnd SubRun:120135150165180195x= 7(7)Public Sub 输出直角三角形图案1()Dim i, j As IntegerFor i = 1 To 9Debug.PrintNextFor i = 1 To 4Debug.Print Tab(20); "*";For j = 1 To (2 * i - 2)Debug.Print "*";NextDebug.PrintNextEnd SubRun:****************Public Sub 输出直角三角形图案2() Dim i, j As IntegerFor i = 1 To 9Debug.PrintNextDebug.Print Tab(20); "*";For i = 1 To 4Debug.Print Tab(19 - i); "*";For j = 1 To (i + 1)Debug.Print "*";NextDebug.PrintNextEnd SubRun:*******************Public Sub 输出平行四边形图案() Dim i, j As IntegerFor i = 1 To 9Debug.PrintNextFor i = 1 To 5Debug.Print Tab(21 - i);For j = 1 To 6Debug.Print "*";NextDebug.PrintNextEnd SubRun:******************************(8)Public Sub 求选手获得的平均分()Dim score(1 To 11), minno, maxno, sum, aver As Single Dim i As Integerminno = 1maxno = 1sum = 0For i = 1 To 10score(i) = Val(InputBox("请输入选手的成绩值:")) Debug.Print score(i)NextFor i = 2 To 10If score(i) < score(minno) Thenminno = iEnd IfIf score(i) > score(maxno) Thenmaxno = iEnd IfNext iFor i = 1 To 10sum = sum + score(i)Next isum = sum - score(minno) - score(maxno)aver = sum / 8Debug.Print "该选手的平均分是:"; averEnd Sub(9)关于素数的求解(9-1)求100之内的所有素数Public Sub 求所有素数之和()Dim s, w, n As Integers = 0For w = 2 To 99 Step 2For n = 2 To Sqr(w)If w Mod n = 0 ThenExit ForEnd IfNextIf n > Sqr(w) Thens = s + wEnd IfDebug.Print "S="; sNextEnd Sub(9-2)Public Sub 求200以内的所有素数()Dim w, n As IntegerDebug.Print "200 以内的所有素数是:" For w = 2 To 199For n = 2 To Sqr(w)If w Mod n = 0 ThenExit ForEnd IfNext nIf n > Sqr(w) ThenDebug.Print w;End IfNextDebug.PrintEnd Sub(10)Public Sub 求水仙花数1()Dim i, j, k, n As IntegerDebug.Print "水仙花数是:"For i = 1 To 9For j = 0 To 9For k = 0 To 9n = i * 100 + j * 10 + kIf n = i * i * i + j * j * j + k * k * k ThenDebug.Print n;End IfNext kNext jNext iDebug.PrintEnd SubPublic Sub 求水仙花数2()Dim i, j, k, n As IntegerDebug.Print "水仙花数是:"For n = 150 To 999i = Int(n / 100)j = Int(n / 10 - i * 10)k = n Mod 10If n = i * i * i + j * j * j + k * k * k ThenDebug.Print n;End IfNextDebug.PrintEnd Subrun:水仙花数是:153 370 371 407(11)Public Sub 求分数数列和()Dim i, t, n As IntegerDim a, b, s As Singlen = 20a = 2:b = 1: s = 0For i = 1 To ns = s + a / bt = aa = a + bb = tNextDebug.Print "sum="; s;End Sub(12)Public Sub N年达到的利息()Dim y As IntegerDim interest1,interest As DoubleP=10000y = 0interest = 0Do Until interest >= 1000Interest1 =2*p* 0.0225 *(1-0.2) ‘一期2年整存整取扣税后的利息p=p+interest1 ‘扣税后的利息加上本金成为新一期的本金Interest=p-10000 ‘存款以来实际所的利息y = y + 2Debug.Print interest, yLoopEnd SubRun:360 2732.959999999999 4 1119.34656 6。
-数据库原理及应用第二版-第8章数据库设计

需求 分析
逻辑结构 设计
物理 设计
图 7- 2
8.1.3数据库设计的基本步骤
需求分析阶段 概念结构设计 结构设计阶段 逻辑结构设计 物理结构设计 功能设计 行为设计阶段 事务设计 程序设计 数据库实施阶段 数据库运行和维护
需求分析:收集信息并进行分析和整理,是后 续的各个阶段的基础。概念结构设计:对需求分析 的结果进行综合、归纳形成一个独立于具体的DBMS 的概念模型。逻辑结构设计:将概念结构设计的结 果转换为某个具体的DBMS所支持的数据模型,并对 其进行优化。物理数据库设计:为逻辑结构设计的 结果选取一个最适合应用环境的数据库物理结构。 数据库行为设计:要设计所包含的功能,功能间的 关联关系以及一些功能的完整性要求;数据库实 施:运用DBMS提供的数据语言以及数据库开发工 具,根据逻辑设计和物理设计的结果建立数据库, 编制应用程序,组织数据入库并进行试运行。数据 库运行和维护阶段:投入正式使用,在其使用过程 中不断对其进行调整、修改和完善。
常用的发现事实的方法有: 1、检查文档 2、面谈 3、观察业务的运转 4、研究 5、问卷调查
8.3 数据库结构设计
8.3.1概念结构设计
概念设计的特点和策略 1、概念模型的特点 有丰富的语义表达能力。 易于交流和理解。 易于更改。 易于向各种数据模型转换,易于导出与DBMS 有关的逻辑模型。
必须注意:关系上定义的索引数并不是越多越好, 系统为维护索引要付出代价,查找索引也要付出代价。 例如,若一个关系的更新频率很高,这个关系上定义的 索引数不能太多。因为更新一个关系时,必须对这个关 系上有关的索引做相应的修改。
聚簇存取方法 为了提供某个属性或属性组的查询速 度,把这个或这些属性(称为聚簇码)上具有 相同值的元祖集中存放在连续的物理块称为 聚簇。 一个数据库可建立多个聚簇,一个关系 只能加入一个聚簇。
数据库系统概述(第四版)王珊萨师煊第8章数据库编程

8.1 嵌入式SQL
8.1.1 嵌入式SQL的处理过程 8.1.2 嵌入式SQL与主语言的通信 3. 不使用游标的SQL语句 4. 使用游标的SQL语句 5. 动态SQL 6. 小结
An Introduction to Database System
/*嵌入式SQL*/
SET Sage = :NEWAGE
WHERE CURRENT OF SX ;
}
/*对当前游标指向的学生年龄进行更新*/
}
EXEC SQL CLOSE SX;
/*关闭游标SX不再和查询结果对应*/
EXEC SQL COMMIT WORK;
/*提交更新*/
EXEC SQL DISCONNECT TEST;
/*定义SQL通信区*/
An Introduction to Database System
程序实例(续)
int main(void)
/*C语言主程序开始*/
{
int count = 0;
char yn;
/*变量yn代表yes或no*/
printf("Please choose the department name(CS/MA/IS): ");
8.1.2 嵌入式SQL语句与主语言之间的通信
❖ 将SQL嵌入到高级语言中混合编程,程序中会含有两种不 同计算模型的语句 SQL语句
➢ 描述性的面向集合的语句 ➢ 负责操纵数据库
高级语言语句
➢ 过程性的面向记录的语句 ➢ 负责控制程序流程
它们之间应该如何通信?
An Introduction to Database System
数据库原理与设计第8章 数据库管理PPT课件学案

8.1数据库的安全性
数据库的安全性是指保护数据库以防止不合法的使用 所造成的数据泄漏、更改或破坏。
安全性的问题涉及到许多方面,其中包括: ●法律、社会和伦理方面的问题,例如请求查询人是不是有合法的权 限; ●物理控制方面的问题,例如机房的保护措施; ●政策方面的问题;如公安监察等系统人员允许存取指定的数据; ●允许方面的问题,如使用口令保密问题; ●硬件控制方面的问题,如CPU的安全性; ●操作系统的安全性问题;如Windows和Linux/Unix的本身安全; ●数据库系统本身的安全性问题;
6
8.1.2安全性级别
访问控制是对用户访问数据库各种资源(表、视图、系统目录、使用程序 等)的权限(包括创建、查询、修改、删除、执行等)的控制。也就 是说,用户必须获得对数据库对象(比如表、视图等)的操作权限, 才能在规定的权限之内操作数据库。 按用户权限的大小,一般可将用户划分为如下三类。 1.具有DBA特权的数据库用户 2.支配部分数据库资源特权的数据库用户 3.一般数据库用户
5
8.1.1安全性控制
4.数据加密 数据加密是防止数据库中数据在存储和传输中失密的有效手段,通常采 用的加密方式有替换加密,就是使用密钥将文中的每一个字符转换成密 文中的字符。还有一种就是转换加密。就是将文中的字符按不同的顺序 重新排列。在实际当中通常会将两者结合起来使用,以达到更高的安全 程度,而且现在已经有了各种各样的加密算法。 5.审计 审计功能把用户对数据库的所有操作自动记录下来放入审计日志(Audit log)中。DBA可以利用审计跟踪的信息,重现导致数据库现有状况的一 系列事件,找出非法存取数据的人、时间和内容等。 审计通常是很费时间和空间的,会大大增加系统地开销,所以DBMS往往 都将其作为可选特征,允许DBA根据应用安全的要求,灵活地打开或关闭 审计功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 例,Cousor 1 • 例,Cousor 2
动态SQL简介
• 允许在程序运行过程中临时“组 装”SQL语句 • 支持动态组装SQL语句和动态参数两种 形式
一、使用SQL语句主变量
• SQL语句主变量:
– 程序主变量包含的内容是SQL语句的内容, 而不是原来保存数据的输入或输出变量 – SQL语句主变量在程序执行期间可以设定不 同的SQL语句,然后立即执行
游标
• 执行方式的差别
– SQL:一次一集合 – 主语言:一次一记录
• 游标:在查询结果的记录集合中移动的指针 • 一个SQL语句返回单个元组,则不用游标 • 若一个SQL语句返回多个元组,则使用游标
建立和关闭数据库连接
• 建立数据库连接
– EXEC SQL CONNECT TO target [as connection-name] [USER user-name];
• 指示变量
– 用来指示返回给主变量的值是否为null值,以及返 回给主变量的字符串是否发生了截断
• 指示变量的返回值
– = 0:取到主变量的值不空,没有发生截断 – = 1:取到主变量的值为空值 – > 0:取到主变量的值发生了截断,指示变量的值是 截断前的字符串的实际长度
EXEC SQL BEGIN DECLARE SECTION char s_no; char s_name[30]; int s_age; short name_id; short age_id; EXEC SQL END DECLARE SECTION EXEC SQL select SNAME , AGE into :s_name : name_id , :s_age: age_id from student where SNO = :s_no ;
--声明变量 DECLARE @no1 char(5),@no2 char(6),@fs char(2) --声明游标 DECLARE fs_cursor CURSOR FOR SELECT sno,cno, CASE WHEN grade>=90 THEN 'A' WHEN grade>=80 THEN 'B' WHEN grade>=70 THEN 'C' WHEN grade>=60 THEN 'D' WHEN grade<60 THEN 'E' END FROM sc WHERE grade IS NOT NULL ORDER BY sno --打开游标 OPEN fs_cursor --提取第一行数据 FETCH NEXT FROM fs_cursor INTO @no1,@no2,@fs --打印表标题 PRINT '学号 课程号 等级' PRINT '-----------------' WHILE @@FETCH_STATUS = 0 BEGIN --打印一行数据 PRINT @no1+' '+@no2+' '+@fs --提取下一行数据 FETCH NEXT FROM fs_cursor INTO @no1,@no2,@fs END --关闭游标 CLOSE fs_cursor --释放游标 DEALLOCATE fs_cursor GO
3.嵌入SQL语句与主语言之间的数据传递
• SQL通讯区
– SQL通讯区SQLCA是一结构,每一嵌入SQL 语句的执行情况在其执行完成后写入 SQLCA结构中的各变量中. 必须在应用程序中包括: EXEC SQL INCLUDE SQLCA;
SQLCA中的变量
struct sqlca { char sqlcaid[8]; 标识一个SQL通讯区 long sqlabc; 保留SQL通讯区的长度 long sqlcode; 执行SQL语句的状态码 struct { unsigned short sqlerrml;错误信息文本长度 char sqlerrmc[70]; 错误信息文本 }sqlerrm; char sqlerrp[8]; 出错信息(按单元) long sqlerrd[6]; char sqlwarn[8]; 警告信息(按单元设置为W标志) char sqlext[8]; 未用 }; struct sqlca sqlca;
• 状态指示变量SQLCODE反映了SQL语句 执行情况. • SQLCODE为
– 零值时,表示SQL语句执行成功. – 正值(〉0)时表示警告信息. – 负值(〈0)时表示出现错误.
主变量
• 既可以用在主语句中,也可用在SQL语句中, 用来在两者之间传递数据 • 主变量的说明
– EXEC SQL BEGIN DECLARE SECTION – 说明主变量 – EXEC SQL END DECLARE SECTION
2. 嵌入式SQL处理过程
主语言 + 嵌入SQL RDBMS预处理
主语言 +ຫໍສະໝຸດ 函数调用主语言编译器编译 主语言执行程序
嵌入式SQL的一般形式:
区分SQL语句与主语言语句,嵌入的SQL 语句以EXEC SQL开始,以分号(;) 结束. 例,EXEC SQL delete from student where SNO = ’10’;
• 创建基本表TEST
EXEC SQL BEGIN DECLARE SECTION; const char *stmt = "CREATE TABLE test(a int);"; /* SQL 语句主变量 */ EXEC SQL END DECLARE SECTION; ... ... EXEC SQL EXECUTE IMMEDIATE :stmt;
fetch [next | prior | first | last 游标名 into [主变量表] 缺省值为NEXT
• Close: 关闭游标,释放活动集及其所占资源。需要 再使用该游标时,执行open语句
close 游标名
• 编写一个程序,采用游标方式输出所有 学号、课程号和成绩等级。
• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •
• 关闭数据库连接
– EXEC SQL DISCONNECT [connection]
例,
EXEC SQL BEGIN DECLARE SECTION; char id[7]; char title[81]; int royalty; EXEC SQL END DECLARE SECTION; /* 说明主变量结束*/ EXEC SQL INCLUDE sqlca; /* (1) 定义SQL 通信区*/ main() { EXEC SQL CONNECT TO PUBS USER SA ; EXEC SQL DECLARE C1 CURSOR FOR SELECT tit_id, tit, roy FROM titles; EXEC SQL OPEN C1; while (SQLCODE == 0) { /* SQLCODE will be zero if data is successfully fetched */ EXEC SQL FETCH C1 INTO :id, :title, :royalty; if (SQLCODE == 0) { printf("%s %d %s", id, royalty,title); } } EXEC SQL CLOSE C1; EXEC SQL DISCONNECT PUBS; }
第八章 数据库编程
Yusncun@
本章主要内容:
• 嵌入式SQL • 存储过程 • Odbc编程
8.1 嵌入式SQL
1. 为什么使用嵌入式SQL?
– 交互式SQL不能适应事务处理的过程性. – 表达能力相比高级语言有一定的限制. – 有些动作如与用户交互、图形化显示数据等 只能用高级语言实现
1.定义部分 • DECLARE -----变量、常量、游标、异常等
– 定义的变量、常量等只能在该基本块中使用 – 当基本块执行结束时,定义就不再存在
2.执行部分
BEGIN ------SQL语句、PL/SQL的流程控制语句 EXCEPTION ------异常处理部分 END;
8.2.2 变量
• Transact-SQL 中可以使用两种变量:局部变量和全局 变量。 • 1.局部变量
4.不需要游标的sql语句
• 不需要游标的数据操作,结果是一个元 组的select语句
EXEC SQL select SNAME , AGE into :s_name, :s_age from student where SNO = :s_no ;
• insert语句
EXEC SQL insert into stduent values (:s_no, :s_name , :s_age , :dept_no ) ;
• delete语句
EXEC SQL delete from stduent where SNO= :s_no ;
• update语句
EXEC SQL update stduent set AGE = :s_age where SNO = : s_no ;
5.使用游标的SQL语句
• 查询结果中包含多个元组时,使用游标 可以逐个存取这些元组。 • Current 形式的UPDATE和DELETE语句 • 活动集:select语句返回的元组的集合 • 当前行:活动集中当前处理的那一行。 游标即是指向当前行的指针
8.2存储过程
• SQL-invoked routines:
– 存储过程(SQL-invoked procedure) – 函数(SQL-invoked function)