数据库系统概论第8章 数据库编程(2003)

合集下载

数据库系统第八章PPT课件

数据库系统第八章PPT课件

}
EXEC AQL CLOSE C1;
} 2020/10/13
5
五、程序实例
[例1] 依次检查某个系的学生记录,交互式更新某些ECLARE SECTION;
char deptname[20];
char HSno(9);
char HSname(20);
char HSsex(2);
EXEC SQL UPDATE Student SET Sage=:NEWAGE WHERE CURRENT OF SX;
} } EXEC SQL CLOSE SX; EXEC SQL COMMIT WORK; EXEC SQL DISCONNECT TEST; }
2020/10/13
8
8.1.3 不用游标的SQL语句
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);
在COBOL中以END-EXEC结束:
EXEC SQL <SQL语句> END-EXEC
例如一条交互式的SQL语句:
DROP TABLE Student; 嵌入到C程序中,应写作:
2020/1E0/X13EC SQL DROP TABLE Student;
2
8.1.2 嵌入式SQL语句与主语言之间的通信
scanf(“%s”, &deptname);

第8章数据库编程(2)

第8章数据库编程(2)

//定义变量 //定义变量
//Allocate an environment handle retcode=SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv); if(retcode<0) //错误处理 { printf("allocate ODBC Environment handle errors."); return -1; } retcode=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3,SQL_IS_INTEGER); //Allocate a connection handle retcode=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc1); if(retcode<0) //错误处理 { printf("allocate ODBC connection handle errors."); return -1; }
9/12
while(1) { retcode=SQLFetch(hstmt1); if(retcode==SQL_NO_DATA) break; retcode=SQLGetData(hstmt1,1,SQL_C_CHAR, name,MaxNameLen,&columnLen); retcode=SQLGetData(hstmt1,2,SQL_C_CHAR, dept,MaxNameLen,&columnLen); if(columnLen>0) printf("name=%s dept=%s\n",name,dept); else printf("name=%s dept=NULL\n",name,dept); } /*Clean up*/ SQLFreeHandle(SQL_HANDLE_STMT,hstmt1); SQLDisconnect(hdbc1); SQLFreeHandle(SQL_HANDLE_DBC,hdbc1); SQLFreeHandle(SQL_HANDLE_ENV,henv); return(0);

数据库8

数据库8

数据库系统概论第八章数据库编程第八章数据库编程第一节T-SQL编程基础第二节游标第三节存储过程第四节自定义函数第五节触发器教学目标掌握变量、运算、系统函数、控制语句 存储过程、自定义函数了解游标重点存储过程、自定义函数难点自定义函数T -SQL SQL编程基础编程基础 标示符 注释语句表达式流程控制语句系统函数标示符 标示符分类常规标识符(严格遵守标识符格式规则) 界定标识符(引号”或方括号[]) 标识符格式规则 (1)字母或_、@、#开头的字母数字或_、@、$序列(2)()不与保留字相同(3)长度小于128不符合规则的标识符必须加以界定(双引号””或(4)不符合规则的标识符必须加以界定(双引号或方括号[])注释语句注释语句是对程序代码的说明或暂时禁用,是程序代码中不编译执行的语句。

单行注释--例:--求‘3-105’课程的平均分例多行注释/**/例:/* 作者:创建时间创建时间:*/表达式数据类型整数数据、字符数据、货币数据、日期和时间数据、二进制字符串等变量局部变量局部变量是用户定义,必须以@开头,在程序内声明,并只能在该程序内使用。

(1)局部变量的声明@[,]DECLATE @<局部变量名> <数据类型>[,…n](2)局部变量的赋值SET|SELECT @<局部变量名>=<表达式>例1-1创建一个@myvar变量,然后将一个字符串11@将值放在变量中,最后输出@myvar变量的值。

DECLARE@h(20)DECLARE @myvar char(20)select @myvar= 'This is a test'SELECT @myvarSELECT@myvar例1-2 用SET语句和SELECT语句为局部变量赋值。

DECLARE @var1 datetime,@var2 char(10)DECLARE@var1datetime@var2char(10)SET @var1 = getdate()SELECT@var2=convert(char(10)@var1102)SELECT @var2 = convert(char(10),@var1,102)Select @var2 --显示@var2全局变量全局变量是SQL Server系统内部使用的变量,以@@开头。

第八章 并发控制 《数据库系统概论》概要

第八章 并发控制 《数据库系统概论》概要

协调并发事务的执行,保证数据库的一致性不受 破坏,同时避免用户得到不正确的数据。

下面以几个例子说明在并发操作下,调度不当 会带来数据的不一致性问题。 有三类数据不一致性:参见P265.图8.1


① 丢失修改(丢失更新) ② 不可重复读(不一致分析) ③ 读“脏”数据(依赖于未提交的更新)
11
数据不一致性: 丢失修改

丢失修改(丢失更新)

一事务所做的更新操作因另一事务的操作而 丢失。两种情况: (1) 一事务所做的更新结果被另一事务的更 新结果“冲掉” 。 参见P265.图8.1(a) (2) 一事务所做的更新结果因另一事务的撤 消而丢失。
12


数据不一致性:丢失修改(续1)

三个事务并行调度:
T1
read(A); write(A); read(B); rollback;
T2
read(A); Commit;
T1
read(A); read(B); write(A); rollback;
T2
T3
read(A) write(A);
read(A)
10
8.1 并发控制概述

DBMS并发调度子系统的职责
第八章 并发 控制
《数据库系统概论》
离性,需要对多个 事务的并发操作进行控制 --- 并发控制。 本章介绍的并发控制技术属于事务处理技术。目的 是保证事务的隔离性。


事务是数据库恢复和并发控制的基本单位。
8.1 并发控制概述 8.2 封锁 8.3 封锁协议 8.4 活锁和死锁
事务T2 t2~t3
4
并发操作:并行执行

多个事务并行地存取DB

第八章 数据库

第八章 数据库

• 例,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 ;

数据库编程讲解

数据库编程讲解
要执行的操作提交给数据库驱动程序,
ODBC数据库应用程序
驱动程序管理器
SQLServer Oracle 驱动程序 驱动程序
Foxpro 驱动程序
Sybase 驱动程序通过针对不
同数据源的
驱动程序实
SQLServer Oracle
Foxpro
Sybase 现对不同数
数据源
数据源
数据源
数据源 据源的各种
8.1 数据访问方式的变迁 1.直接访问数据库
使用数据库系统所提供的专用开发工具(如嵌入式 SQL语言),开发的应用程序只能运行在特定的数据库 系统环境下,适应性和可移植性比较差。
8.1 数据访问方式的变迁
2. ODBC(Open Database Connectivity 开放数据库连接)
客户程序
DataSource= c:\library.mdb; User ID=rose; ‘ rose可为管理员名 Password=sa; ' sa为系统管理员密码 Persist Security Info=True "
ConnectionString
参数设置 SQL Server方法
cnn.Open "Provider=MSDASQL; driver={SQL Server}; server=myServerName;"_ &"database=myDatabaseName; uid=myUserName; pwd=myPassWord;"
第八章 数据库编程
数据库编程概述
SNO
SN
S1
赵亦
S2
钱尔
S3
孙珊
S4
李思
D DEPT

0008 数据库编程


CREATE PROCEDURE TRANSFER @outAccount char(3), @inAccount char(3), @amount FLOAT AS update account set BALANCE = BALANCE - @amount where accountId = @outAccount update account set BALANCE=BALANCE + @amount where accountId = @inAccount
create procedure GetAvg @sname varchar(10), @avgGrade int output as select @avgGrade = avg(grade) from student inner join sc on student.sno = sc.sno where sname = @sname
SQL Server存储过程 存储过程
• 例 3 :带输入和输出参数的存储过程 DECLARE @g1 int EXEC GetAvg '数学 @g1 output 数学', 数学 print @g1
SQL Server存储过程 存储过程
• 定义存储过程,完成根据学生姓名返回该学生的 定义存储过程, 平均成绩的功能。 平均成绩的功能。
SQL Server存储过程 存储过程
• 例 2:带参数的存储过程 : • 修改前面的存储过程,根据传入的参数来查询 修改前面的存储过程, 相应的记录。 相应的记录。 来修改例1中已经 • 使用 使用ALTER PROCEDURE来修改例 中已经 来修改例 创建好的存储过程。 创建好的存储过程。: • alter procedure GetS @name varchar(10) as select * from student where sname = @name • EXEC GetS '刘晨 刘晨' 刘晨

第八章数据库编程-SJTU

仅用于宿主语言的语句中
嵌入式SQL——变量
主变量的定义
Exec Sql Begin Declare Setction; … Exec Sql End Declare Setction;
嵌入式SQL——游标(Cursor)
数据库操作的结果分为单记录和多记录 单记录:变量 select…into… 多记录:游标(游标的定义,打开和关闭)
Exec sql Declare <游标名> Cursor for <查询块> For Update Of <属性名>;
移动指针/获取数据
Exec sql Fetch <游标名> Into <共享变量名> <指示变量 名>,...
嵌入式SQL——游标的使用
判断是否到底
sqlca.sqlcode
关闭游标
Exec sql Close <游标名>;
嵌入式SQL——游标的使用
Current 形式的 Update 定义游标
第八章 数据库编程
思考:SQL语言有什么缺陷?
本章内容 应用系统如何对数据库进行操作
嵌入式SQL 存贮过程 SQL/API(Application Programming
Interface)一组函数和程序
从宿主语言主程序中调用一个SQL DBMS库,而SQL 语句是这个调用的参数
ODBC JDBC SQL/CLI: The library for C is called
Exec sql Begin declare Section;
if(sqlca.sqlcode <> SUCCESS)
Char sno(5);

第八章数据库编程_数据库原理



8.1.1 嵌入式SQL的处理过程
嵌入式SQL是将SQL语句嵌入程序设计语言中,被 嵌入的程序设计语言,如C,C++,PB,JAVA,VB等 称谓宿主语言,简称主语言。 对ESQL,RDBMS一般采用预编译方法处理,即由 RDBMS的预处理程序对源程序进行扫描,识别出ESQL 语句,把它们转换成语言调用语句,以使主语言编 译程序能识别它们,然后由主语言的编译程序将纯 的主语言程序编译成目标码。 在ESQL中,为了能够区分SQL语句和主语言语句, 所有SQL语句都必须加标志。但不同主语言所规定加 的标志不同。

四、建立和关闭数据库连接
嵌入式SQL程序要访问数据库必须先连接数据库。 RDBMS根据用户信息对连接请求进行合法性验证, 只有通过身份验证,才能建立一个合法连接。 1、建立数据库连接 2、关闭数据库连接 当某个连接上的所有数据库操作完成后,应用程 序应该主动释放所占用的连接资源。

五、程序实例,以PB为主语言进行讲解
三、错误处理 如果PL/SQL在执行时出现异常,则应该让程序在 产生异常的语句处停下来,根据异常的类型去执行 异常处理。使用时要根据具体DBMS系统来进行处 理。
8.2.4 存储过程
存储过程和函数是命名块,它们被编译后保存在数 据库中,可以被反复调用,运行速度快。
一、存储过程的优点
1、由于存储过程不像解释执行的SQL语句那样在 提出操作请求时才进行语法分析和优化工作,因而 运行效率高,它提供了在服务器端快速执行SQL语 句的有效途径。
8.1.2

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

第8章数据库编程(2)


}
Hale Waihona Puke 13/16小结ODBC工作原理 ODBC API基础 ODBC工作流程 ODBC编程实例
14/16
作业
补充习题3:简述ODBC的组成部分和工作流程。 预习9.1~9.4。
15/16
5/16
ODBC API基础:各数据库厂商的ODBC应用程序接口(ODBC Application Interface)都要符合API和语法的一致性。 函数概述:ODBC3.0标准提供了76个函数接口,大致分为: 分配和释放环境句柄、连接句柄、语句句柄。 连接函数(SQLConnect等)。 与信息相关的函数(SQLGetData等)。 执行相关函数(SQLExecDirect等)。 句柄及其属性:句柄是一代表指针的32位整数值,ODBC3.0 中句柄分为环境句柄、连接句柄、语句句柄和描述符句柄。 环境句柄:每个ODBC应用程序需要建立一个ODBC环境,分 配一个环境句柄,存取数据的全局性背景如环境状态、当前在 环境句柄上分配的连接句柄。
6/16
连接句柄:一个环境句柄可以建立多个连接句柄,每个连接句 柄实现与一个数据源之间的连接。 语句句柄:在一个连接中可以建立多个语句句柄,它不仅是一 个SQL语句,还包括SQL语句产生的结果集以及相关的信息。 描述符句柄:描述SQL语句的参数、结果集列的元数据集合。 数据类型:ODBC定义了两套数据类型,即SQL数据类型和C 数据类型,前者用于数据源,后者用于应用程序的C代码。 ODBC的工作流程 配置数据源:示例:将ss数据库定义成一个系统数据源。 初始化环境:调用SQLAllocHandle函数分配环境句柄。 建立连接:调用SQLAllocHandle函数分配连接句柄,通过 SQLConnect与数据源连接,其输入参数为数据源名称、用户 ID和口令。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档