版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、DB2 UDB 编程及存储过程,课程代码:CY430,第 3 卷:UDT、UDF 和大对象,第 1 单元,编程结构、UDT 和 UDF,学习目标,在完成本单元的学习后,您将能够: 解释 UDT 和 UDF 的概念 描述如何执行 UDT 和 UDF 讨论如何用 Java 编写 UDF 程序 解释表功能 描述如何从 SQL 语句中引用 UDF,用户定义类型(UDT)的概念,UDT 是基于基本的 SQL 数据类型定义的 这独立于构建 UDF 的编程语言 需要超出基本的数据类型 UDT 帮助数据建立上下文 DB2 用户定义类型(UDT)有两种类型 清晰类型 结构类型,用户定义类型(UDT)的清晰类型,
2、清晰类型是从一种原始数据类型派生出来的 清晰类型加强了数据的强类型 清晰类型支持比较操作 用户定义清晰类型是用 CREATE DISTINCT TYPE 语句创建的 当需要与基本数据类型相似的数据,并且在该数据中有约束时,会使用清晰类型数据,用户定义类型(UDT)的结构类型,结构类型是一个或一个以上数据类型的集合 结构类型与 C 语言中的结构相似 用户定义结构类型是用 CREATE TYPE 语句创建的 用户定义结构类型通常在数据有一个以上与其关联的属性的时候被创建,用户定义函数(UDF)的概念,DB2 提供了程序库,以便可以在 C、C+、COBOL 和 Java 中执行 UDF UDF 可以
3、由上列任意一种语言进行定义 UDF 命名应该是完全限定的名称 模式名 函数名 如果没有提到模式名,可以用函数路径来处理 UDF,用户定义函数(UDF)的概念 2,宿主变量使 SQL 数据类型和编程语言数据类型能够产生交互作用 宿主变量定义有一个采用宿主语言定义的可变类型,以适合 SQL 中定义的每种标准的数据类型 用户定义函数首先是用一种 HOST 语言来创建的 程序是用必要的 DB2 程序库编译并链接的,用户定义函数(UDF)的概念 3,创建的程序库文件放在 DB2 程序库路径下 用户定义函数是用 CREATE FUNCTION 语句向 DB2 注册 UDF 一旦注册后,可以像使用标准的 S
4、QL 预定义的函数一样在 SQL 语句中使用 这些函数可以用 DROP FUNCTION 语句结束,用 Java 编写 UDF 程序,用 Java 创建 UDF 有一系列步骤 用 JAVA 编写 UD 编译 UDF 测试 UDF 调试 UDF 向 DB2 注册 UDF,编写 UDF,在 Java 中,定义 UDF 就像定义标准的 Java 方法 DB2 提供一个特别的数据包、一组类和方法以用 Java 编写 UDF 程序 接口 COM.ibm.db2.app.UDF 提供类 有 UDF 的类应当扩充这个接口 数据包 COM.ibm.db2.app 也有与基本 SQL 数据类型相应的变量定义,编
5、写 UDF 2,public class UserDefinedClassName extends COM.ibm.db2.app.UDF void method (paramtype1 param1, paramtype2 param2) import COM.ibm.db2.app.*; import java.sql.*; public class MyUDF extends UDF public void methodName(parameters) . ,静态方法的特征,它们只可以返回一个值 返回值将与 SQL 类型中的一个相对应 它产生一个 SQLException 值是使用标准的
6、 Java return 语句返回的 输入的参数是与基本 SQL 类型(宿主变量)相对应的 Java 输入类型 静态方法用 CREATE FUNCTION 向 DB2 注册 但是 PARAMETER STYLE 将是 Java,使用静态方法的一个示例,public class MyUDF extends UDF public static int findGreater (int a, int b) throws SQLException try if (ab) return a; else return b; catch(Exception e) throw new SQLException
7、(Invalid operation,38702); / try-catch 方法结束 / findGreater 方法结束 / 类定义结束,向 DB2 注册 UDF 的代码,Create function findGreater(int,int) Returns int External name MyUDF!findGreater Language Java Parameter Style JAVA No SQL Not Deterministic No External Action,非静态方法的特征,非静态方法可以包括输入和输出参数 输出参数的返回值可以通过过载设置方法来进行设置 在
8、CREATE FUNCTION 语句中,参数类型将是 DB2General 非静态函数有一组与 C 语言程序库中函数相类似的参数,以供 DB2 UDF 使用,使用非静态函数的一个示例,public class MyUDF extends UDF public void findgreater(int number1, int number2, int greater) throws Exception try /*如果数 1 比数 2 大,则返回数 1*/ if (number1 number2) greater = number1; set(3,greater); else greater
9、= number2; set(3,greater); /* if 语句结束 */ catch(Exception e) throw new Exception(Exception while comparing the numbers); / end of function / 类定义结束,向 DB2 注册非静态 UDF 的代码,CREATE FUNCTION findGreater (INTEGER, INTEGER) RETURNS INTEGER EXTERNAL NAME MyUdf!findgreater LANGUAGE JAVA PARAMETER STYLE DB2Genera
10、l NO SQL DETERMINISTIC NO EXTERNAL ACTION,编译 UDF,创建的 Java 文件将用 Java 编译器进行编译 “/SQLLIB/Java”必须在路径中 作为输出的类文件应该被置于 DB2 服务器中的文件夹“/SQLLIB/function”中 Java 程序应该用 CREATE FUNCTION 语句注册,Java 中的宿主变量,了解 Java 数据类型是如何定义与 SQL 数据类型相匹配是很重要的 这可以由定义的变量,称之为宿主变量来完成 Java 中的参数类型是与 SQL 基本数据类型相对应的 一些宿主变量 SMALLINT VARCHAR REA
11、L DATE,Java 中过载的 UDF,可以象标准的 Java 函数一样过载 UDF 具有相同函数名和不同函数特征符 不同的特征符意味着输入数据的数据类型不同 如果不同,则输入参数的次序就不同 只是不同的返回类型,UDF 不是过载的,解析 UDF,UDF 调用的解析基于以下三个特征 函数特征符 函数路径 参数匹配,函数选择流程图,Jar 文件和 UDF,JAR 代表 Java 压缩文件 UDF 的类文件与相关联的类文件集一起能够被压缩 创建 jar cvf classfile1.class classfile2.class 用 DB2 安装 call sqlj.install_jar(“fi
12、le:poundJar.jar“, “Pound_Jar“),表函数和 UDF,表函数的创建,CREATE FUNCTION Department() RETURNS TABLE(departmentId INTEGER) EXTERNAL NAME DepartmentDetails!department LANGUAGE JAVA PARAMETER STYLE DB2GENERAL EXTERNAL ACTION DETERMINISTIC No SQL SCRATCHPAD FINAL CALL DISALLOW PARALLEL CARDINALITY 10;,一些有用的调试技巧,与
13、类路径相关的问题 与函数特征符相关的问题 多个同名类 再编译类 SQL 状态,小结,既然您已经完成了本单元的学习,您应该能够: 解释 UDT 和 UDF 的概念 描述如何执行 UDT 和 UDF 讨论如何用 Java 编写 UDF 程序 解释表功能 描述如何从 SQL 语句中引用 UDF,第 2 单元,编程结构、UDT 和 UDF 实验,实验练习,第 3 单元,使用大对象,学习目标,在完成本单元的学习后,您将能够: 定义 LOB 识别不同的 LOB 类型 解释如何编写在 LOB 上进行数据操作的 Java 程序,大对象(LOB)是什么?,存储大量数据的对象 有不同的数据类型可以存储数据 BLO
14、B 双字符大对象 CLOB 字符大对象 DBCLOB 双字节字符大对象,BLOB,它被称为双字符大对象 用来存储双字节 是长度变化的数据,可以存储长达 2G 字节的数据 用来存储非传统数据 图片 音频 图象 混合媒体,CLOB,字符大对象 用来存储大的字符串数据 是长度变化的数据,可以存储长达 2G 字节的数据 用来存储大的单字节字符集数据 其示例是各种文档,DBCLOB,双字节字符大对象 是长度变化的数据,可以存储长达 2G 字节的数据 用来存储大的双字节字符集数据 示例是各种文档 它被认为是一个图形字符串,LOB 存储机理,与表中其他数据类型的存储机理不同 不与其它数据一起存储 与表中数据
15、存储在不同位置 为什么这样安排?,大对象的数据操作,创建一个表,其中 LOB 数据类型是 simple 有列名和数据类型的 CREATE TABLE 语句 数据类型可以是 CLOB、BLOB 或者是 DBCLOB 处理 LOB 值的两种不同的方法论 使用文件访问变量 使用 LOB 定位器,文件访问变量,实质上用于两种情况 在 LOB 值能够直接从数据库提取并且写进文件的情况下 在一个 LOB 列需要从一个文件直接更新的情况下 它们的存储要求减少到最小量 用于在客户端之间来回地对一个 LOB 值进行物理移动,员工数据的数据库表,Java 程序代码,import java.sql.*; impor
16、t java.io.*; public class EmployeeDetails / URL 是 jdbc:db2:dbname static String url = jdbc:db2:IBM; static String userid = db2admin; static String passwd = db2admin; / 以下函数用来获得和数据库的连接 public static Connection getConnection() Connection con= null;,Java 程序代码 2,try Class.forName(COM.ibm.db2.jdbc.app.DB
17、2Driver).newInstance(); con= DriverManager.getConnection(url, userid, passwd); catch(Exception e)e.printStackTrace(); return con; public static void main(String argv) Connection con=null; PreparedStatement pstmt=null; ResultSet rs=null; int empid,choice,c; String fileName,fullPath;,Java 程序代码 3,/ 要求用
18、户选择她想要执行的数据操作 System.out.println(1 : To update the employee info); System.out.println(2 : To retrieve and store the picture in the local machine ); System.out.print(Select the operation of ur choice by entering the number ); try BufferedReader br = new BufferedReader(new InputStreamReader(System.in)
19、; String choiceStr = br.readLine();,Java 程序代码 4,/ 检查所选的选项是否有效 if(choiceStr.equals() System.out.println(Please enter your choice and then proceed); System.exit(1); else choice = Integer.parseInt(choiceStr); switch(choice) case 1: / 员工照片更新 / 收集了用户输入的数据 System.out.print(Enter the Employee id: );,Java 程
20、序代码 5,empid=Integer.parseInt(br.readLine(); System.out.print(Enter the file name with the file extension: );fileName=br.readLine(); System.out.print(Enter the Complete path of the Physical Directory where the Image is stored: ); fullPath=br.readLine(); fullPath = fullPath +/+ fileName; / 声明了文件访问变量 F
21、ile file = new File(fullPath);,Java 程序代码 6,InputStream fin = new FileInputStream(file); con=getConnection(); String query=update employeedetails set image=? , filename=? where employeeid=+empid; pstmt=con.prepareStatement(query); /* 当执行完预备语句后,来自于存储在磁盘上的物理文件的二进制数据将被导入数据库表的一个列 */ pstmt.setBinaryStream
22、(1,fin,150000); pstmt.setString(2,filename); pstmt.execute(); System.out.println(data updated); break; case 2: /查看员工照片 System.out.print(Enter the Employee id: );,Java 程序代码 7,empid=Integer.parseInt(br.readLine(); System.out.print(Enter the directory path where the image needs to be put :); fullPath=b
23、r.readLine(); con = getConnection(); Statement st = con.createStatement(); rs = st.executeQuery(SELECT filename,image FROM Employeedetails where employeeid=+empid); if(rs.next() BufferedInputStream bis; bis = newBufferedInputStream(rs.getBinaryStream (image) ); System.out.println(fullPath+/+rs.getSt
24、ring(filename);,Java 程序代码 8,/ 导出数据库表的 BLOB 数据 FileOutputStream fos = new FileOutputStream(fullPath+/+rs.getString(filename); System.out.println(Success in copying the image from the database to a physical file in the system); try while(c=bis.read()!=-1) fos.write(c); catch (EOFException e) System.ou
25、t.println(End of file error); else ,Java 程序代码 9,System.out.println(Please enter the correct employee id); break; /switch 语句结束 /if else 语句结束 catch(SQLException sqle)sqle.printStackTrace(); catch(IOExceptionioe)System.out.println(Error, enter the file name and the path correctly); /main 方法结束,Java 程序的屏
26、幕快照,LOB 定位器,LOB 值可以通过称为 LOB 定位器的变量访问 应用程序可以使用 LOB 定位器访问一个 LOB 值 它是一个宿主变量,代表数据库中的一个 LOB 值 不是数据库中的一行或者是一个位置 直到交易结束,定位器一直代表一个 LOB 值,LOB 定位器 2,直到定位器被释放,其一直代表一个 LOB 值 定位器是 LOB 类型的一个客户端代表 它不是数据库类型 它不存储在数据库中,用 LOB 定位器对文档进行模式搜索,创建如下显示的一个数据库表,用 LOB 定位器对文档进行模式搜索 2,将一些样本数据置入 Department 表中 编写一个 Java 程序,用 LOB 定位
27、器从部门的 Department Profile 列中把部门业绩打印出来 Java 程序提示用户输入需要打印的业绩的部门号码,使用 LOB 定位器的 Java 程序,File file = new File(departmentprofile.txt); FileInputStream fin = new FileInputStream(file); pstmt=con.prepareStatement(insert into departmentdetails values(?,?,?,?); pstmt.setInt(1,1); / 部门标识 pstmt.setString(2,PRODU
28、CTION); / 部门名称 pstmt.setString(3,London); / 部门位置 pstmt.setAsciiStream(4, fin , 15000); / 部门概况资料 pstmt.execute();,使用 LOB 定位器的 Java 程序 2,public class DepartmentAppl static String url = jdbc:db2:IBM; static String userid = db2admin; static String passwd = db2admin; / 以下方法用来获得和数据库的连接 public static Conne
29、ction getConnection() Connection con= null; try Class.forName(COM.ibm.db2.jdbc.app.DB2Driver).newInstance(); con= DriverManager.getConnection(url, userid,passwd); catch(Exception e)e.printStackTrace(); return con; ,使用 LOB 定位器的 Java 程序 3,public static void main(String argc) throws IOException Connect
30、ion con=null; PreparedStatement pstmt=null; Statement stmt=null; ResultSet rs=null; int deptid; String deptStr,achievements; / 以下部分从用户处得到详细输入 BufferedReader br = new BufferedReader(new InputStreamReader(System.in); System.out.println(Please enter the department number:);,使用 LOB 定位器的 Java 程序 4,deptStr=br.readLine
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 职业规划表演指南
- 在XX市安全生产暨春节前后安全防范工作会议上的讲话
- 甘肃省白银市九中2026届生物高一下期末监测模拟试题含解析
- 齿轮厂设备定点点检细则
- 某变速器厂泡沫垫使用细则
- 医患关系与就业保障探讨
- 胰腺结节筛查知识
- 房地产经纪综合能力考试题及参考答案
- XX中学2025-2026学年春季学期安全消防安全演练活动实施方案
- 2026年春季第二学期学校少先队工作计划:骐骥追风启新程骁勇逐梦向光行
- 零碳工厂培训课件
- 2026四川成都市金牛国投人力资源服务有限公司招聘网格员12人备考考试题库及答案解析
- 2026年机器人集成公司差旅费报销管理细则制度
- 老年患者的尊严护理与人文关怀
- 2026春译林版英语八下-课文课堂笔记
- OOS实验调查培训课件
- 春节后开工第一课安全培训课件
- DB35∕T 2246-2025 白茶感官风味轮
- 2025年及未来5年市场数据中国观光旅游船市场供需现状及投资战略数据分析研究报告
- 博物馆讲解员面试题目集
- 2025年刑事执行检察业务竞赛业务知识卷参考答案
评论
0/150
提交评论