《8数据库编程课件》由会员分享,可在线阅读,更多相关《8数据库编程课件(47页珍藏版)》请在金锄头文库上搜索。
1、数据库系统概论数据库系统概论An Introduction to Database System 第八章第八章 数据库编程数据库编程8数据数据库编库编程程8.1 嵌入式嵌入式SQLSQL语句除了象前面介绍的可以交互的方式使用的外,更常用的方式是用某种传统的编程语言(例如:C、PB、COBOL等)编写程序,但程序中的某些函数或某些语句是SQL语句。这种方式下使用的SQL语言称为嵌入式SQL(EmbeddedSQL),其中传统的编程语言称为宿主语言(或主语言)。8数据数据库编库编程程SQL嵌入高级语言中的方法嵌入高级语言中的方法uC和PowerBuilder等语言,直接嵌入SQL语句uJava、C
2、#等面向对象语言更多的是通过类封装操作数据库的语句,并将SQL作为参数进行调用。8数据数据库编库编程程8.2 ODBC & JDBCODBC:是微软公司开放服务体系(WindowsOpenServicesArchitecture,WOSA)中有关数据库的一个组成部分提供了一组访问数据库的标准API规范RDBMS应用接口8数据数据库编库编程程ODBC应用系统的体系结构:一、用户应用程序二、驱动程序管理器三、数据库驱动程序四、ODBC数据源管理8数据数据库编库编程程8数据数据库编库编程程为什么需要为什么需要JDBCJDBC是Java数据库连接技术的简称,提供连接各种常用数据库的能力Java应用程序
3、应用程序JDBCJDBCJSP/Servlet客户端客户端数据库服务器数据库服务器应用服务器应用服务器数据库服务器数据库服务器客户端客户端8数据数据库编库编程程Java program 1JDBCdatabaseJDBCODBCJDBCJava classWeb ServerBrowserDBAJava program 2Delphi program 1JDBC8数据数据库编库编程程JDBC APIJDBCAPI可做三件事:与数据库建立连接、执行SQL语句、处理结果ConnectionDriverManagerStatementResultSet DriverManager :依据数据库的不同
4、,管理:依据数据库的不同,管理JDBC驱动驱动 Connection :负责连接数据库并担任传送数据的任务:负责连接数据库并担任传送数据的任务 Statement :由由 Connection 产生、负责执行产生、负责执行SQL语句语句 ResultSet:负责保存:负责保存Statement执行后所产生的查询结果执行后所产生的查询结果客户端客户端数据库服务器数据库服务器12348数据数据库编库编程程 Java 数据库连接数据库连接如何用Java建立数据库应用:以数据库SQLServer为例.必要的构件:1.JDK;2.JDBC(一个类库文件jar,其中包含某个驱动器Driver,如net.s
5、ourceforge.jtds.jdbc.Driver)JDBC由两部分构成:接口规范和实现。接口规范是统一的;而实现由数据库厂商提供。JDBC仅负责连接数据库,转发SQL指令和结果。连接前的准备:1.确认数据库服务器已启动。2.JDBC类库文件(如jtds.jar)设在合适的类路径CLASSPATH8数据数据库编库编程程如何连接数据库:连接数据库需要4个参数:1.数据库URL(UniformResourceLocator)如:jdbc:jtds:sqlserver:/localhost:1433/pubs注意:每种DBMS有不同的URL。应参考相关文档。2.驱动器Driver如“net.so
6、urceforge.jtds.jdbc.Driver”注意:每种DBMS使用不同的驱动器。应参考相关文档。3.用户名如“dba”4.口令如“sql” Java 数据库连接(续)数据库连接(续)8数据数据库编库编程程JDBC程序的工作模板程序的工作模板try Class.forName(JDBC驱动类驱动类); catch (ClassNotFoundException e) System.out.println(无法找到驱动类无法找到驱动类);try Connection con=DriverManager.getConnection(JDBC URL,数据库用户名数据库用户名,密码密码);
7、Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(SELECT a, b, c FROM Table1); while (rs.next() int x = rs.getInt(a); String s = rs.getString(b); float f = rs.getFloat(c); /略略 con.close(); catch (SQLException e) e.printStackTrace();获得数据库连接获得数据库连接发送发送Sql语句语句处理结果处理结果注册注册JDBC驱动驱动
8、JDBC URL用来标识数据库用来标识数据库 必须处理的异常必须处理的异常释放资源释放资源必须处理的异常必须处理的异常8数据数据库编库编程程下面方法执行一个Select语句,加载某客户信息并初始化当前对象。publicClassCustomer.publicintloadCustomer(intcustid)throwsExceptionStringsql=selectcustomer.custid,name,prov,city,phone,unit,count(distinctsalesorder.orderno),sum(quantity),sum(singlecost*quantity)
9、+fromcustomerNaturalLeftOuterJoin(salesorderkeyjoinsalesitem)+wherecustomer.custid=?+groupbycustomer.custid,name,prov,city,phone,unit;try PreparedStatementprepSt=con.prepareStatement(sql);prepSt.setInt(1,custid);ResultSetrs=prepSt.executeQuery(); Java 数据库连接数据库连接8数据数据库编库编程程if(rs.next()this.custid=rs.
10、getInt(1);name=rs.getString(2);prov=rs.getString(3);city=rs.getString(4);phone=rs.getString(5);unit=rs.getString(6);ordernum=rs.getInt(7);quantity=rs.getInt(8);amount=rs.getDouble(9);prepSt.close();elseprepSt.close();thrownewException(客户:+custid+不存在);catch(SQLExceptionex)dbcon.printSQLException(ex);
11、returncustid; Java 数据库连接数据库连接(续续)8数据数据库编库编程程8.3 T_SQLTransact-SQL语言是Microsoft开发的一种SQL语言,简称T-SQL语言。8数据数据库编库编程程标识符标识符n长度不超过128个字符。n开头字母为a-z或A-Z、#、_或以及来自其它语言的字母字符。n后续字符可以是a-z、A-Z、来自其它语言的字母字符、数字、#、$、_、。n不允许嵌入空格或其它特殊字符。n不允许与保留字同名。8数据数据库编库编程程常用数据类型常用数据类型Data TypeDesc.Max Lengthcharfixed size8000 character
12、svarcharVariable size8000 characterstextVariable size231 - 1 ncharUnicode, fixed size4000 charactersnvarcharUnicode, Variable size4000 charactersntextUnicode, Variable size230 - 1 8数据数据库编库编程程常用数据类型(续)常用数据类型(续)Data TypeStorage SizeMinimumMaximumint4 bytes-231231 1smallint2 bytes-215215 1tinyint1 byte
13、0255bigint8 bytes-263263 1bit1 bit018数据数据库编库编程程常用数据类型(续)常用数据类型(续)Data TypeStorage Sizebinary8000 bytesvarbinary8000 bytesimage=90BEGINPRINT成绩优秀!SELECT*FROMscWHEREcno=1ENDELSEPRINT继续努力!8数据数据库编库编程程WHILE循循环环WHILE 布尔表达式 BEGIN sql语句 | 语句块 END8数据数据库编库编程程WHILE循循环环举例举例u求1到100之间的奇数和。DECLARE i smallint,sum sm
14、allintSET i=1SET sum=0WHILE i=90setlevel=Aelseifgrade=80setlevel=Belseifgrade=70setlevel=Celseifgrade=60setlevel=Delsesetlevel=Eprintsno+cno+cast(gradeasvarchar)+levelfetchc1intosno,cno,grade;endclosec1;deallocatec1;8数据数据库编库编程程8.5 存储过程存储过程u存储过程(StoredProcedure)可以使得对数据库的管理、以及显示关于数据库及其用户信息的工作容易得多。存储过程
15、是存储过程是SQI语句和可选语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量,有条件执行以及其他强大的编程功能。u存储过程可包含程序流、逻辑以及对数据库的查询。它们可以接受参数,输出参数、返回单个或多个结果集以及返回值。u存储过程是封装重复性工作的一种方法。存储过程支持用户声明的变量、条件执行和其他有用的编程功能。8数据数据库编库编程程创建存储过程语法创建存储过程语法CREATEPROCEDUREprocedure_nameparameterd
16、ata_type=defaultOUTPUT,.nASsql_statement.n8数据数据库编库编程程举例举例CreateProceduremsp_getStusdeptvarchar(15)asSelect*fromstudentwheresdept=sdept8数据数据库编库编程程执行存储过程执行存储过程u方法1:execmsp_getStuisu方法2:execmsp_getStusdept=isu方法3:declaresvarchar(15)sets=isexecmsp_getStusdept=s8数据数据库编库编程程Output参数参数CREATE PROCEDURE dbo.m
17、athtutorm1 smallint,m2 smallint,result smallint OUTPUTASSET result = m1 * m2DECLARE answer smallintEXECUTE mathtutor 5, 6, answer OUTPUTSELECT The result is: , answerThe result is: 30Creating Stored Creating Stored ProcedureProcedureExecuting StoredExecuting StoredProcedureProcedureResults of Stored
18、Results of StoredProcedureProcedure8数据数据库编库编程程8.6 函数函数uSQLServer允许用户创建自定义函数,自定义函数可以有返回值。u自定义函数分为:标量值函数或表值函数p如果RETURNS子句指定一种标量数据类型,则函数为标量值函数。可以使用多条Transact-SQL语句定义标量值函数。p如果RETURNS子句指定TABLE,则函数为表值函数。u表值函数又可分为:内嵌表值函数(行内函数)或多语句函数p如果RETURNS子句指定的TABLE不附带列的列表,则该函数为内嵌表值函数。p如果RETURNS子句指定的TABLE类型带有列及其数据类型,则该函
19、数是多语句表值函数。8数据数据库编库编程程标量值函数标量值函数语法Createfunction函数名(参数)Returns返回值数据类型asbeginSQL语句(必须有return变量或值)End8数据数据库编库编程程u例1:求每个学生的平均成绩createfunctionudf_getAvgScore(snovarchar(5)returnsfloatbegindeclareavgfloat;selectavg=AVG(grade)fromscwheresno=snoreturnavgendselect sno,sname,dbo.udf_getAvgScore(sno)from stude
20、nt8数据数据库编库编程程表值函数u内联表值函数语法createfunction函数名(参数)returnstableasreturn(一条SQL语句)8数据数据库编库编程程例3createfunctionudf_getFailExam(cnovarchar(5)returnsTableasreturn(selectstudent.sno,snamefromstudent,scwherestudent.sno=sc.snoandcno=cnoandgrade60)select *from dbo.udf_getFailExam(1)8数据数据库编库编程程u多语句表值函数createfuncti
21、on函数名(参数)returns表格变量名table(表格变量定义)asbeginSQL语句end8数据数据库编库编程程例4createfunctionudf_getEnroll()returnstable1Table(snovarchar(5),snamevarchar(10),cnovarchar(5),cnamevarchar(12),gradefloat)asbegininsertintotable1selectstudent.sno,sname,sc.Cno,cname,gradefromstudent,sc,coursewherestudent.Sno=sc.Snoandsc.Cno=oreturn;endselect *from dbo.udf_getEnroll()8数据数据库编库编程程