DB2_UDB_编程及存储过程_第1页
DB2_UDB_编程及存储过程_第2页
DB2_UDB_编程及存储过程_第3页
DB2_UDB_编程及存储过程_第4页
DB2_UDB_编程及存储过程_第5页
已阅读5页,还剩151页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、DB2 UDB 编程及存储过程编程及存储过程第第 1 卷:卷:DB2 编程基础编程基础和和 SQL课程描述课程描述本课程是用来向学生介绍 DB2 UDB 编程及存储过程的课程的范围是提供对 DB2 UDB 编程相关概念的一个基本的理解。也介绍了存储过程、UDT 和 UDF预备条件预备条件要想从本课程中获得最多知识,学习者必须满足下列条件。不满足这些先决条件的学习者可能不能完全理解并利用本课程所提供的材料 明晰的 RDBMS 基本概念和术语 用 Java 编写的有针对性的代码对象程序预备条件(续)预备条件(续)设计并开发 JDBC 程序这些技能可通过完成下列课程的学习获得关系数据库管理系统(RD

2、BMS)概念和结构化查询语言(SQL)核心 Java 语言 课程目标课程目标在完成本课程的学习后,您应该能够: 描述数据库应用程序并应用 DB2 编程的基本原理 理解与 DB2 交互的 Java 程序和 applet 利用应用程序包工作并将其划分为逻辑单元 定义触发器并对各种数据库对象使用触发器课程目标课程目标 . 2在完成本课程的学习后,您应该能够: 理解嵌入式 SQL 概念并使用 SQLJ 语法 了解到存储过程与 SQL 过程化语言结合使用的需要 使用存储过程构建器利用 SQL/PL 开发存储过程 采用 SQL/PL 编写服务器程序、创建程序,并注册到 DB2 中 用 Java 开发存储过

3、程服务器课程目标课程目标 3在完成本课程的学习后,您应该能够: 理解用户定义数据类型及用户定义函数的概念 对大对象利用表函数和数据操作 定义并行控制和数据库恢复处理 阐明已确认的协议并提供一个故障的简要分类 理解描述支持系统及事务处理 日程安排日程安排本课程每一单元的课时数均为 2 小时第第 1 单元单元用用 Java 进行进行 DB2 的编程的编程 学习目标学习目标在完成本单元的学习后,您将能够: 解释各种数据库应用程序 识别不同的应用开发环境 描述 DB2 编程的各种基本原理 解释 JDBC 和 SQLJ 编程 SQL 的局限性的局限性不像 C、C+ 或 Java 具有能编写复杂程序的能力

4、只是一种简单的查询语言能力局限于表间关联数据及较快的数据检索 不支持控制结构或循环结构应用开发环境应用开发环境 在 DB2 服务器或客户机上开发及部署应用程序的能力 驻留有 DB2 数据库的节点称为 DB2 服务器 驻留有 DB2 客户端实用程序的节点则称为 DB2 客户机应用程序可以驻留在同时含有 DB2 的相同机器上也可驻留在 DB2 客户机上客户机实用程序可帮助连接到数据库上适应于应用开发环境的软件适应于应用开发环境的软件 编程语言环境DB2通用数据库DB2客户端实用程序可用的编程方法可用的编程方法嵌入式 SQL调用层接口(CLI)Java 接口JDBCSQLJ其它接口ODBC 终端用户

5、工具嵌入式嵌入式 SQL SQL受缺乏程序能力的局限能在编程语言中嵌入 SQL 语句嵌入式 SQL 应用程序使用 C/C+、COBOL、FORTRAN、Java(SQLJ)以及 REXX 语言开发成为可能 静态嵌入式 SQL 动态嵌入式 SQL 调用层接口调用层接口(CLI) 应用程序访问 DB2 数据库的公共编程接口基于 X/Open 标准 用一种编程语言如 C/C+ 编写 DB2 为许多语言提供了应用程序编程接口(API)。可以通过适当的参数直接调用各种 API 函数 比较比较 CLI 和嵌入式和嵌入式 SQLCLI嵌入式嵌入式 SQL应用程序的移植性较高移植性较在 CLI 中的稍低不需要

6、特定的语言编译程序需要特定的语言预编译程序应用程序易于管理如果对象存在的数据库中结构改变,需要和数据库重新绑定DB2 多重释放中接口一致特定编程语言释放特殊Java 接口和程序接口和程序Applet应用程序ServletJBDCSQLJDB2数据库其它第三方工具其它第三方工具 DB2数据库Lotus ScriptPerl DBINet.Data同台机器中的同台机器中的 JDBC 应用程序和应用程序和 DB2 数据库服务器数据库服务器 本地机器本地机器JDBC 应用程序应用程序JDBC 驱动程序驱动程序CLI本地数据库本地数据库DB2 服务器安装服务器安装不同机器上的不同机器上的 JDBC 应用

7、程序和应用程序和 DB2 数据库服务器数据库服务器 客户机客户机JDBC 应用程序应用程序JDBC 驱动程序驱动程序CLI远程数据库远程数据库DB2 客户机安装客户机安装服务器服务器DB2 服务器安装服务器安装连接连接 JDBC 服务器的服务器的 JDBC Applet HTTP 服务器服务器HTTP 服务器服务器远程数据库远程数据库DB2 安装安装HTTP 客户机客户机HTTP 浏览器浏览器JDBC AppletJDBC Applet 服务器服务器CLI本地数据库本地数据库HTTPTCP/IP 套接字套接字静态静态 SQL 语句语句在预先知道访问的语句类型和数据库对象的时候使用语句类型可以是

8、 DDL 语句(例如 CREATE) 也可以是 DML 语句(例如 INSERT 、 UPDATE、 DELETE 或 SELECT) 数据库对象可以是表视图以及访问的各个列唯一未知的是语句正在搜索或修改的数据值 动态动态 SQL 语句语句编译时不需要任何语句类型和数据库对象信息在运行时间构建并发送到数据库 在运行时间构建并发送到数据库 访问路径在运行时间构建 在运行时执行查询JDBC API 支持动态 SQL 语句SQLJ 编程编程创建一个 SQLJ源文件转换到本地机Java 源代码创建DB2 数据包嵌入式SQL使用 SQLJ翻译器使用db2profc JDBC API应用程序层应用程序层驱

9、动程序层驱动程序层数据库应用开发人员使用驱动程序供应商执行Java 编程的问题说明编程的问题说明用户调用应用程序输入用户标识、密码将用户标识、密码作为输入对认证表进行检查如果检查成功,欢迎用户进入系统Java 应用程序代码应用程序代码import java.sql.*;class DB2Appl public static void main(String argv) / 声明块从这里开始Connection con = null;/ URL 是 jdbc:db2:dbname / 在这个例子中,dbname 为 sampleString url = jdbc:db2:sample;Java

10、应用程序代码应用程序代码 2/数据库连接的用户标识和密码 String userid = db2admin;String passwd = db2admin;String username=;String password=;ResultSet rs=null;/声明块在这里结束 Java 应用程序代码应用程序代码 3try /程序块 1 开始/ 需要装载 DB2 JDBC 驱动程序Class.forName(COM.ibm.db2.jdbc.app.DB2Driver).newInstance();con = DriverManager.getConnection(url, userid,

11、passwd);/ 程序块 1 结束 Java 应用程序代码应用程序代码 4/ 程序块 2 开始/ 从用户处接受一个有效的用户名和密码if (argv.length = 0) System.out.println(username and password fields cannot be empty);System.exit(0);else if(argv.length = 2) username=argv0;password=argv1; Java 应用程序代码应用程序代码 5else/If the fields are emptySystem.out.println(username a

12、nd password fields cannot be empty);System.exit(0);/ 程序块 2 结束Java 应用程序代码应用程序代码 6/ 程序块 3 开始 / 创建了语句对象 Statement stmt = con.createStatement(); /检查记录是否在表中/执行了 SQL 查询,置入结果集rs=stmt.executeQuery(SELECT count(*) fromAuthenticate where userid=+username+ and password=+password+);rs.next(); Java 应用程序代码应用程序代码

13、7if(rs.getInt(1) 0)System.out.println(Thank u for logging in);elseSystem.out.println(Invalid username and password);rs.close();stmt.close();/程序块 3 结束。 catch( Exception e ) System.out.println(e); Java 应用程序屏幕快照应用程序屏幕快照 Java Applet 屏幕快照屏幕快照 Java Applet 屏幕快照屏幕快照 2 Java Applet 屏幕快照屏幕快照 3 小结小结既然您已经完成了本单元的

14、学习,您应该能够: 解释各种数据库应用程序 识别不同的应用开发环境 描述 DB2 编程的各种基本原理 解释 JDBC 和 SQLJ 编程 第第 2 单元单元使用使用 Java 实验进行实验进行 DB2 编程编程实验练习实验练习第第 3 单元单元构建构建 DB2 应用程序的概念应用程序的概念 学习目标学习目标在完成本单元的学习后,您将能够: 明确部分基本的应用程序构建基本原理 解释应用程序数据包 区分静态和动态 SQL 讨论怎样将应用程序组织成逻辑的工作单元 描述 Sequence 对象和标识列基本术语基本术语数据库应用程序数据库应用程序访问计划访问计划绑定过程绑定过程任何与数据库交流的应用程序

15、 SQL 语句是如何执行的? 寻找一个优化的路径 对于每个应用程序,都会在数据库中创建并存储一个数据包数据数据包包包含针对嵌入式 SQL 语句的访问计划的数据库对象由包含静态 SQL 语句的应用程序创建当执行该应用程序时,数据库管理器便使用该数据包数据包创建过程数据包创建过程用嵌入式用嵌入式 SQL 写源程序写源程序预编译源程序以得到预编译源程序以得到 修改的源文件修改的源文件用主机语言编译器进行用主机语言编译器进行编译编译与与 DB2 及主机及主机 语言库链接语言库链接 运行此应用程序运行此应用程序数据库中存储的数据包数据库中存储的数据包静态静态 SQLSQL 语句类型、数据库对象名称以及列

16、名称在编译之前已经提供语句查找或更新的数据值是未知在应用程序运行之前,将创建静态 SQL 语句静态静态 SQL 的优点的优点访问计划访问计划 持久性持久性访问管理与安全访问管理与安全性能性能简单编程简单编程静态SQL静态静态 SQL 的缺点的缺点重建需要的重建需要的缺乏灵活性缺乏灵活性静态SQL动态动态 SQL 的优点的优点对象独立对象独立 灵活性灵活性动态SQL最佳的访问计划最佳的访问计划 动态动态 SQL 的缺点的缺点不可预测的性能不可预测的性能动态SQL相同的相同的 SQL 语句语句可能执行更快或更慢可能执行更快或更慢问题说明问题说明为包含两个表(学生表和教师表)的数据库设计一个通用的数

17、据输入应用程序Student列列数据类型数据类型注释注释StudentIdInt唯一的标识以鉴别每个学生StudentNameVarchar(50)学生的姓名AddressVarchar(100)学生的地址PhoneNoVarchar(50)学生的电话号码问题说明问题说明 2Instructor列列数据类型数据类型注释注释InstructorIdInt唯一的标识以鉴别每个教师InstructorNameVarchar(50)教师的姓名AddressVarchar(100)教师的地址PhoneNoVarchar(50)教师的电话号码问题的问题的 Java 代码代码import java.sql.

18、*;import java.io.*;import java.util.*;class DataEntryAppl1 / URL 是 jdbc:db2:dbnamestatic String url = jdbc:db2:IBM;static String userid = db2admin;static String passwd = db2admin; 问题的问题的 Java 代码代码 2/ 下列函数获得对数据库的连接public static Connection getConnection()Connection con= null;tryClass.forName(COM.ibm.d

19、b2.jdbc.app.DB2Driver).newInstance();con= DriverManager.getConnection(url, userid, passwd);catch(Exception e)e.printStackTrace();return con; 问题的问题的 Java 代码代码 3public static void executeQry(String stateQry)Connection con = null;ResultSet rs=null;Statement stmt=null;trycon=getConnection();stmt=con.cre

20、ateStatement();stmt.executeQuery(stateQry);System.out.println(The operation is complete);catch(Exception)System.out.println(Error occurred, Error can be due to improper input values); 问题的问题的 Java 代码代码 4public static void main(String argv) throws IOException int choice=0,id=0;String stateQry=,name,ad

21、dress,phoneNo,tableName;/ 要求从用户处得到输入值System.out.println(1 : To enter student details);System.out.println(2 : To enter instructor details);System.out.print(Select the operation of your choice by entering the number: );BufferedReader br = new BufferedReader(new InputStreamReader(System.in);String choi

22、ceStr = br.readLine();问题的问题的 Java 代码代码 5/ 检查用户是否输入了正确的选项if(choiceStr.equals()System.out.println(Please enter your choice and then proceed);System.exit(1);elsechoice = Integer.parseInt(choiceStr);/* 基于用户所作的选择, */ 问题的问题的 Java 代码代码 6if(choice = 1)tableName=student;elsetableName=instructor;/ 要求用户选择她想做的那

23、种操作System.out.println(1 : Insert new record);System.out.println(2 : Update records);System.out.println(3 : delete a record);System.out.print(Select the operation of ur choice by entering the number: );choiceStr = br.readLine(); 问题的问题的 Java 代码代码 7/ 检查所选的选项是否有效 if(choiceStr.equals()System.out.println(

24、Please enter your choice and then proceed);System.exit(1);elsechoice = Integer.parseInt(choiceStr); 问题的问题的 Java 代码代码 8switch(choice)case 1: / 这种情况是针对插入操作的System.out.print(Enter Student/instructor id:);id=Integer.parseInt(br.readLine();System.out.print(Enter Student/instructor name );name=br.readLine

25、();System.out.print(Enter Student/instructor address );address=br.readLine();System.out.print(Enter Student/instructor phone no: );phoneNo=br.readLine(); 问题的问题的 Java 代码代码 9switch(choice)case 1: / 这种情况是针对插入操作的System.out.print(Enter Student / instructor id:);id=Integer.parseInt(br.readLine();System.ou

26、t.print(Enter Student / instructor name: );name=br.readLine();System.out.print(Enter Student / instructor address: );问题的问题的 Java 代码代码 10address=br.readLine();System.out.print(Enter Student/instructor phone no: );phoneNo=br.readLine();stateQry=insert into +tableName+ values(+id+,+name+,+address+,+pho

27、neNo+);/ 执行构建的 Insert 语句executeQry(stateQry);break;case 2: / 这种情况是针对更改操作的System.out.print(Enter the student/instructor id:);id=Integer.parseInt(br.readLine(); 问题的问题的 Java 代码代码 11/ 给用户选项,使之选择他或她想更改的列名System.out.println(A : To update address: ); System.out.print(P : To update phone number: );String op

28、tion = br.readLine();if(option.equals()System.out.println(Select an operation and then proceed);elseif(option.equalsIgnoreCase(A)System.out.print(Enter the address you want to update: ); 问题的问题的 Java 代码代码 12address=br.readLine();stateQry=update +tableName+ set address=+address+ where +tableName+id=+i

29、d;elseSystem.out.print(Enter the PhoneNo you want to update: );phoneNo=br.readLine();stateQry=update +tableName+ set phoneno=+phoneNo+ where +tableName+id=+id; 问题的问题的 Java 代码代码 13/ 执行了构建的更新语句executeQry(stateQry);break;case 3: / 这种情况是针对删除操作的System.out.print(Enter the student / instructor id: );id=Int

30、eger.parseInt(br.readLine();stateQry=Delete from +tableName+ where +tableName+id=+id; 问题的问题的 Java 代码代码 14/ 执行了构建的 Delete 语句executeQry(stateQry);break; /switch 语句结束 /if else 语句结束 /if else 语句结束 /main 方法结束 执行执行 Java 代码时的快照代码时的快照事务事务执行简单任务的操作集 也被称为逻辑工作单元(LUW) 可能包含多个步骤如果所有的步骤都已完成,事务就完成了并可以被提交如果任何一步没有完成,事

31、务没有完成并必须被回滚事务管理事务管理提交回滚保存点提交事务提交事务在最后一个 COMMIT 语句完成 Permanent 设置后,所有的数据操作便完成了在 事 务 中 使 S Q L 语 句 执 行 的 更 改 为 Permenant 设置 BEGINSELECT empno, salary FROM emp WHERE empno=2567UPDATE emp set salary=11000SELECT empno, salary FROM emp WHERE empno=2567INSERT INTO emp(empno,salary) VALUES (2568,20000)SELEC

32、T empno, salary FROM emp WHERE empno=2568COMMITEND 回滚事务回滚事务如果任何一条语句失败,到那点为止的已完成的数据操作需要撤销这种撤销的行为便称为回滚 在事务中回滚可被执行到某个特定的点 ROLLBACK 和 COMMIT 语句保证了数据的一致性 回滚意味着撤销一条未提交事务中的 SQL 语句已经执行的针对数据的所有更改回滚事务回滚事务 2BEGINSELECT empno, salary FROM emp WHERE empno=2567UPDATE emp set salary=11000SELECT empno, salary FROM

33、emp WHERE empno=2567ROLLBACKENDBEGININSERT INTO emp(empno,salary) VALUES (2568,20000)SELECT empno, salary FROM emp WHERE empno=2568COMMITEND 保存点保存点定义在事务上下文中的中间标记 它们将一个长的事务分成几个小的部分在事务中的当前点,但在事务中已声明的保存点之后给出回滚工作的选项保存点保存点BeginSELECT empno, salary FROM emp WHERE empno=2567UPDATE emp set salary=11000SAVEP

34、OINT aSELECT empno, salary FROM emp WHERE empno=2567ROLLBACK TO SAVEPOINT aINSERT INTO emp(empno,salary) VALUES (2568,20000)SELECT empno, salary FROM emp WHERE empno=2568COMMITEnd 事务的开始和结束事务的开始和结束当执行第一条可执行 SQL 语句时,事务开始事务在此点及时开始 它在任何下列情况发生的时候结束 一 条 C O M M I T 或 R O L L B A C K 语 句 ( 没 有 SAVEPOINT 从句

35、)被执行 DDL 语句(如 CREATE、DROP、ALTER)被执行 如果用户断开数据库连接,则提交当前事务 如果一个用户进程异常终止,则回滚当前事务生成的列生成的列也被称为派生的列这些列的值可由一个表达式生成 它们可以直接存储在数据库里不需要数据输入标识列标识列应用程序在数据库外生成数字 将计数器作为一个单一行存储在独立表中 在数据库端处理标识列 序列序列一种数据对象,与数据库中任何其它数据对象相类似用来产生序列数 序列对象由两个重要的表达式操作: PREVVAL NEXTVAL 序列对象由 CREATE 语句创建 通过发布 VALUES 语句增加 序列对象对标识列序列对象对标识列序列对象

36、对标识列序列对象对标识列序列对象序列对象标识列标识列此对象生成的值可用于任何数据库对象它与一个特定的列和表格相关这些值是在要求下生成的并可用于任何 SQL 语句这儿它自动生成小结小结既然您已经完成了本单元的学习,您应该能够: 明确部分基本的应用程序构建基本原理 解释应用程序数据包 区分静态和动态 SQL 讨论怎样将应用程序组织成逻辑的工作单元 描述序列对象和标识列第第 4 单元单元构建构建 DB2 应用程序的概念实验应用程序的概念实验 实验练习实验练习第第 5 单元单元DB2 触发器触发器学习目标学习目标在完成本单元的学习后,您应该能够: 解释触发器的概念 描述在应用程序中设置触发器的优点 讨

37、论对各种数据库对象使用触发器 触发器的基本原理触发器的基本原理当数据中发生某些活动时,会调用一组操作也能够在数据库外调用一个操作也能够在数据库外调用一个操作 可以用来满足各种应用程序需求触发器是驻留在 RDBMS 内部的事件驱动程序数据库管理器管理触发器 触发器的基本原理触发器的基本原理 2触发器只能创建一次 当某个特定事件或活动发生时,数据库管理器将其激活可被看作 RDBMS 内设置的一个规则此操作是必要的一个更新操作 插入操作 更新操作 删除操作 触发器的特征触发器的特征通常在表级别实现它们与特定的表绑定在一起 表中发生的任何变化都将激活一个触发器事件 触发器不可被消除 触发器事件和触发操

38、作触发器事件和触发操作触发器事件 当向表中插入数据、更新列数据或从表中删除记录时 可以调用与更新进程相关联的触发器触发操作 当触发器事件发生时,触发器执行的进程 可以是一个单独的 SQL 语句或一组 SQL 语句 也可以是一个存储过程调用或一个用户定义函数的调用触发器的优点触发器的优点一系列业务规则的全局库 触发器对于实现各种业务规则非常有效 一旦这些规则被构建为触发器,它们便可以跨应用程序使用 较少的耦合 触发器可以减少商业逻辑和为商业目的开发应用程序之间的耦合 加强数据完整性 使用触发器可以加强参考完整性 创建触发器创建触发器在创建时,触发器必须与一张表相关联 触发器的各种属性值都必须声明

39、 要创建的触发器名 与触发器相关联的表 将激活触发器的序列和事件 触发粒度 触发操作 转换表值(如果有)创建触发器的一个示例创建触发器的一个示例CREATE TRIGGER NewRecruit AFTER INSERT ON EMPLOYEEFOR EACH ROW MODE DB2SQLUPDATE Organization SET NoOfEmployees = NoOfEmployees + 1 示例表示例表ORGANIZATION (ORGNAME VARCHAR (20),TOTALEMP INTEGER , TOTALDEPT INTEGER) DEPARTMENT (DEPTI

40、D INTEGER,DEPTNAME VARCHAR (20) ,TOTALEMP INTEGER) 示例表示例表 2EMPLOYEEINFO (“EMPID” INTEGER,”EMPNAME” VARCHAR(20),”DEPTID” INTEGER) ACTIVITYLOG (TIME TIMESTAMP, ACTIVITYDESC VARCHAR (50)规定执行序列规定执行序列 触发器可以在更新事件发生之前执行,也可以在更新事件发生之后执行 BEFORE 规定触发操作应该在更新事件执行之前被调用 AFTER 规定触发操作应该在更新事件执行之后再执行规定执行序列规定执行序列 2 CRE

41、ATE TRIGGER NEW_INFOAFTER INSERT ON EMPLOYEEINFOFOR EACH ROW MODE DB2SQL UPDATE ORGANIZATION SET TOTALEMP = TOTALEMP + 1 触发器粒度触发器粒度规定一个事件调用触发操作的次数表操作中的触发器调用可能基于两个事件 它基于特定表中调用的语句 它也基于由于更新事件将会影响的行数 触发器的粒度指定 FOR EACH STATEMENT FOR EACH ROW 触发器粒度触发器粒度 2CREATE TRIGGER EMP_NO AFTER DELETE ON EMPLOYEEINFOF

42、OR EACH ROW MODE DB2SQL UPDATE DEPARTMENT SET TOTALEMP=TOTALEMP 1 触发器粒度触发器粒度 3CREATE TRIGGER LOG_UPDATE_EMP AFTER UPDATE ON EMPLOYEEINFO FOR EACH STATEMENT MODE DB2SQL INSERT INTO ACTIVITYLOG VALUES(CURRENT TIMESTAMP, UPDATE:EMPLOYEEINFO) 转换值和表转换值和表 触发器影响到的值或行是由相关变量规定的触发器可以访问这些正在进行转换的值表触发器可以访问变量 NEW

43、 作为相关名称 OLD 作为相关名称转换值和表转换值和表 2 CREATE TRIGGER OLD_DEPT_UPDATE AFTER UPDATE OF DEPTID ON EMPLOYEEINFO REFERENCING NEW_TABLE AS N_TABLEOLD AS O_ROW FOR EACH ROW MODE DB2SQL UPDATE DEPARTMENT SET TOTALEMP=TOTALEMP - 1 WHERE DEPTID=O_ROW.DEPTID 转换值和表转换值和表 3CREATE TRIGGER NEW_DEPT_UPDATEAFTER UPDATE OF D

44、EPTID ON EMPLOYEEINFO REFERENCING NEW_TABLE AS N_TABLE NEW AS N_ROW FOR EACH ROW MODE DB2SQL UPDATE DEPARTMENT SET TOTALEMP=TOTALEMP + 1 WHERE DEPTID=N_ROW.DEPTID 级联触发器级联触发器 一个触发器可以调用另一个触发器,以此类推由于一个触发器引起一系列触发器的调用称之为级联触发器 级联触发器级联触发器 2 CREATE TRIGGER DEPT_ADDED AFTER INSERT ON DEPARTMENT FOR EACH ROW

45、MODE DB2SQL UPDATE ORGANIZATION SET TOTALDEPT=TOTALDEPT + 1 CREATE TRIGGER LOG_UPDATE_ORGAFTER UPDATE ON ORGANIZATION FOR EACH STATEMENTMODE DB2SQLINSERT INTO ACTIVITYLOGVALUES (CURRENT TIMESTAMP, UPDATE:ORGANIZATION) 级联触发器级联触发器 3 INSERT 语句的触发器语句的触发器 CREATE TRIGGER INSERT_DEPTBEFORE INSERT ON DEPART

46、MENT FOR EACH ROW MODE DB2SQL INSERT INTO ACTIVITYLOG VALUES (CURRENT TIMESTAMP,INSERTION: DEPARTMENT) Update 语句的触发器语句的触发器 CREATE TRIGGER UPDATE_DEPT AFTER UPDATE ON DEPARTMENT FOR EACH ROW MODE DB2SQL INSERT INTO ACTIVITYLOG VALUES (CURRENT TIMESTAMP,UPDATION: DEPARTMENT) Delete 语句的触发器语句的触发器 CREATE

47、 TRIGGER CHANGE_NO AFTER DELETE ON EMPLOYEEINFOFOR EACH ROW MODE DB2SQL UPDATE ORGANIZATION SET TOTALEMP=TOTALEMP - 1 触发器、触发器、UDT 和和 UDF CREATE TRIGGER EMP_NO AFTER DELETE ON EMPLOYEEINFOFOR EACH ROW MODE DB2SQL UPDATE DEPARTMENT SET TOTALEMP= Decrement (TOTALEMP) 触发器和参考约束触发器和参考约束 触发器和参考约束之间的交互触发器事件

48、可以因为这些约束而改变 确定表集和行集 如果没有行被影响,则没有约束和触发器被应用 如果有些被影响的行被选择为 BEFORE,则触发器针对该集合中每一行处理触发器和参考约束触发器和参考约束 2 语句规定的实际操作应用于这些受影响行的集合 如果应用参考约束拥有级联效果,则其它表中的操作在触发器被处理过后也完成了 只要在任何阶段出现一个错误,则整个操作便会被回滚 触发器的约束触发器的约束触发器中不可以使用指针触发器中不可以使用 Commit 语句SQL SET 变量只可以用在 BEFORE 触发器中BEFORE 触发器不能调用另一个触发器如果在同一事件中对某张特定表应用了多个触发器,则需要排定优先

49、顺序销毁触发器销毁触发器曾经创建的触发器将继续执行当某个特定触发器事件发生时,该触发器数据包无法停止执行 要停止一个触发器DROP TRIGGER DROP TRIGGER EMP_NUM DB2 UDB 内部的触发器数据包内部的触发器数据包 每当数据库存储一个触发器时 DB2 在数据库中创建一个数据包 在它内部的系统目录信息中创建一条记录触发器数据包触发器目录记录小结小结既然您已经完成了本单元的学习,您应该能够: 解释触发器的概念 描述在应用程序中设置触发器的优点 讨论对各种数据库对象使用触发器 第第 6 单元单元DB2 触发器实验触发器实验实验练习实验练习第第 7 单元单元嵌入式嵌入式 S

50、QL学习目标学习目标在完成本单元的学习后,您将能够: 分析嵌入式 SQL 的各种概念 解释如何将 SQL 嵌入一种宿主语言 讨论 SQLJ 语法 描述如何使用 SQLJ 编写 applet 和应用程序 嵌入式嵌入式 SQL 概念概念 将功能强大的 SQL 与宿主语言支持结合 程序内部编写的 SQL 语言不依赖于宿主语言数据库管理器提供了一种宿主语言处理 SQL 语句的机制SQL 处理器在应用程序编译之前处理这些 SQL 语句SQLJ 的组件的组件SQLJ 运行时类 SQLJ 翻译器DB2 SQLJ Profile Customizer(db2profc) DB2 SQLJ Profile Pr

51、inter(db2profc)SQLJ Profile Conversion Tool(profconv)记录 SQL 调用的实用程序与与 DB2 交互的交互的 SQLJ 应用程序应用程序 嵌入式嵌入式 SQL Java 程序结构程序结构 Java 中嵌入式 SQL 程序由称之为 SQLJ 的数据包启用 既可以用于 Java 应用程序,也可以用于 Java applet Java 应用程序需要安装 DB2 客户端软件 DB2 SDApplet 仅需要客户机具有浏览器 DB2 应用程序的组件应用程序的组件为 Java 程序导入运行时库 变量声明为通信区域建立代码使用 CONNECT 语句建立数据

52、库连接语句提供各种数据操作(数据创建、选择和操作)关闭(释放)数据库连接清除其它对象的代码Java 中嵌入式中嵌入式 SQL 的标准数据包的标准数据包sqlj.runtimesqlj.runtime.ref导入到 Java 代码中建立数据库连接建立数据库连接 为 Java 注册 DB2 数据库驱动程序 拥有许多数据库操作的基本的代码 拥有一系列对特定数据库有效的驱动程序 如果服务器端或客户端软件与应用程序位于同一台机器上,则使用的驱动程序是Class.forName(COM.ibm.db2.jdbc.app.DB2Driver).newInstance();如果运行应用程序的机器没有客户端软件

53、,则驱动程序管理器被初始化 Class.forName(COM.DB2Driver).newInstance(); 建立数据库连接建立数据库连接 2 建立连接 使用 DriverManager 建立 URL 字符串的格式为 jdbc:db2:databasenam 建立连接的字符串是 Connection con = DriverManager.getConnection(burl);. 在在 Java 中嵌入简单的中嵌入简单的 SQL 语句语句 编写在特定从句内部的语句称为 SQLJ 从句令牌(#sql)使 SQLJ 翻译起能够理解 SQLJ 从句并对其进行处理#sql delete fro

54、m employee; 在在 SQL 语句中使用语句中使用 Java 参数参数 Java 变量可以用于向 SQL 语句传值也用于从中检索需要的值 在 SQL 语句中使用的 Java 参数称之为宿主变量void deleteEmployeeDetails(int employeeId)#sql delete from employeeDetails where employeeid=:employeeId; 在在 SQL 语句中使用语句中使用 Java 参数参数 2Employee 表表EmployeeId NumberTitle varchar (4)Fname varchar (40)Lna

55、me Varchar (40)Qualification Varchar(90)Workphone IntegerExtension Integer插入语句中的宿主变量插入语句中的宿主变量 void insertDetails (int employeeId,String title, String fName, String lName, String qualification, int phoneNo, int extn)#sql INSERT INTO EMPLOYEEDETAILS VALUES (:employeeId, :title, :fName, :lName, :quali

56、fication, :phoneNo, :extn) ; 更新语句中的宿主变量更新语句中的宿主变量 void updateExtension (int employeeId, int extn)#sql UPDATE EMPLOYEEDETAILS SET Extension = :extn WHERE EMPLOYEEID = :employeeId) ; 将值检索入宿主变量将值检索入宿主变量 #sql SELECT FNAME INTO :fName FROM EMPLOYEEDETAILS where employeeId = :employeeId; 宿主变量可用来从 SQL 语句中检

57、索一个值 每一个选定的列都需要一个宿主变量宿主变量数据类型应该与被选定列的数据类型相匹配准备准备 SQLJ 程序程序 处理处理 NULL 值值嵌入式 SQL 程序使用一种特殊的方式处理 NULL 值嵌入式 SQL 程序使用指示符变量 Java 嵌入式 SQL 程序不使用指示符变量取而代之的是,它们通过将其与 Java 常量 NULL 相比较来处理 NULL 情况处理处理 NULL 值值 2#sql SELECT FNAME INTO :firstname FROM EMPLOYEEDETAILS where employeeId = :employeeId; if (firstname = n

58、ull ) System.out.println (“First Name is Null for the employee id “+employeeId); SQL 异常和异常和 SQLCA 错误代码错误代码 数据库管理器使用 SQL 通信区(SQLCA)结构返回错误信息这种结构在每个 API 调用以及 SQL 语句发出后更新产生的异常包括一个代码编号,该编号与 SQLCA 错误编号相对应SQLCA 和和 DB2 之间的通信之间的通信 SQLCA 错误代码错误代码SQLJ 连接上下文连接上下文 用来连接数据所有嵌入式 SQL 语句均在连接上下文中运行负责建立到不同数据库的多条连接SQLJ 连接上下文连接上下文 2 #sql context ctx; String userid = db2admin;String passwd = db2admin;String url = jdbc:db2:coursewa;Connection con = null;try con = DriverManager.getConnection(url,userid,passwd);D

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论