db2存储过程set?存储过程

精选笔记 bchgfjyf56547 2024-04-12 14:57 10 0

一、oracle存储过程向DB2迁移

数据库迁移可以看作一个特殊的软件开发项目,与其他开发项目不同的是这个项目的需求是确定的,技术障碍较低,主要工作是代码编写和测试。对数据库管理人员来说,数据库数据迁移极具挑战性,一旦措施不当,珍贵的数据资源将面临丢失的危险,要成功地实现数据库数据平滑迁移,需要周密计划和充分准备,并按照一定的步骤来完成。另一方面,数据库迁移项目的成功也主要依赖于客户与开发商的积极配合和有序组织。当然,企业数据库通常数据量都比较大,结构也比较复杂,如果完全通过手工来完成,那是一个不可想象的大工程。所以正确的步骤加合适的迁移工具也能达到事半功倍的效果。

Oracle向DB2迁移的主要流程

Oracle向DB2迁移一般来说遵循3大流程:迁移评估、模拟迁移、正式迁移。

1、迁移评估

全面的评估是迁移成功的一个关键要素,评估的总体目标是发现可能影响迁移过程的问题以便分配足够的资源来保证迁移取得成功。首先,是评估应用环境和应用程序,识别潜在的障碍;第二,您的 Oracle数据库将在多大程度上适应 DB2的硬数据;最后,分析 Oracle数据库对象和过程,识别使用 DB2中不支持的那些特性的对象和过程。

2、模拟迁移

1)在进行模拟迁移前,我们必须先设计数据迁移的方案,一般设计数据迁移方案主要包括以下几个方面工作:研究与数据迁移相关的资料,或在网站上查询相关内容、选择数据迁移的软硬件平台、选择数据迁移方法、选择数据备份和恢复策略、设计数据迁移和测试方案等。

2)根据设计的数据迁移方案,建立一个模拟的数据迁移环境,它既能仿真实际环境又不影响实际数据,然后在数据模拟迁移环境中测试数据迁移的效果。数据模拟迁移前也应按备份策略备份模拟数据,以便数据迁移后能按恢复策略进行恢复测试。

3)根据设计的数据迁移测试方案测试数据模拟迁移,也就是检查数据模拟迁移后数据和应用软件是否正常,主要包括:数据一致性测试、应用软件执行功能测试、性能测试、数据备份和恢复测试等。

3、正式迁移

数据模拟迁移测试成功后,可以正式实施数据的迁移了。在这里介绍一种简单的测试方法,首先利用 DB2兼容特性迁移 Oracle应用,创建兼容模式 DB2数据库。在 DB2 V9.7上启用 Oracle应用程序时,实例和数据库必须处于兼容模式。还建议调整舍入行为以匹配 Oracle。通过把重新验证语义(revalidation semantics)设置为 deferred_force,可以不按依赖次序部署对象。

在 UNIX系统上:

$ db2set DB2_COMPATIBILITY_VECTOR=ORA

$ db2set DB2_DEFERRED_PREPARE_SEMANTICS=YES$ db2stop force

$ db2start

$ db2 create db testdb automatic storage yes on/db2data1,/db2data2,/db2data3 DBPATH ON/db2system PAGESIZE 32 K$ db2 update db cfg for testdb using auto_reval deferred_enforce$ db2 update db cfg for testdb using decflt_rounding round_half_upC:\> db2 update db cfg for testdb using decflt_rounding round_half_up在Windows上:

C:\> db2set DB2_COMPATIBILITY_VECTOR=ORA

C:\> db2set DB2_DEFERRED_PREPARE_SEMANTICS=YESC:\> db2stop force

C:\> db2start

C:\> db2 create db testdb automatic storage yes on C:,D: DBPATH ON E: PAGESIZE 32 KC:\> db2 update db cfg for testdb using auto_reval deferred_enforceC:\> db2 update db cfg for testdb using decflt_rounding round_half_up然后是将 Oracle数据库对象和数据迁移到 DB2。DB2 9.7提供的原生 Oracle PL/SQL和 Oracle SQL支持极大地简化了这一过程。现在我们先来看一个简单的示例,这个例子选自 Oracle来演示 PL/SQL中 CASE语句的使用,例子如下:

set serveroutput on

Drop function Get_Grade3;

create or replace function Get_Grade3(score IN NUMBER) RETURN VARCHAR2 isbegin

use a Searched CASE Statement to find the Grade for thescore passed in as a parameter

CASE

WHEN score BETWEEN 80 AND 100 THEN return A;WHEN score BETWEEN 65 AND 79 THEN return B;WHEN score BETWEEN 50 AND 64 THEN return C;WHEN score BETWEEN 40 AND 49 THEN return D;WHEN score BETWEEN 0 AND 39 THEN return F;Comment the ELSE leg to generate the exceptionELSE return Invalid score;

END CASE;

exception

when CASE_NOT_FOUND then

return Exception- Case Not Found for score-|| score;end Get_Grade3;

select Get_Grade3(-1) from dual

C:\> db2 update db cfg for testdb using decflt_rounding round_half_up把这段代码保存在本地计算机的 D盘下面为 casetest.sql,在 DB2的 CLP plus中运行一下,居然一点都不需要修改就运行成功了,运行的结果如下:

Oracle向 DB2迁移:主要的流程与工具

这说明 DB2对 Oracle的兼容性的支持已经达到了一个很好的程度了。但是并不是所有程序都可以这么幸运的无需要修改就能正确的运行的。为了能够更好的完成迁移工作,还是需要了解两者之间特性的范围,以便我们能够更好的进行修改工作。在这里就不做说明了,大家可以去网上找找。

Oracle向 DB2迁移工具

1. IBM DB2 Migration Toolkit

利用免费的 IBM DB2 Universal Database(UDB)Migration Toolkit(MTK)简化和改进向 DB2 UDB的迁移工作。这个新的迁移实用程序提供了向导和易于使用的五步界面,这些有助于您快速地将现有的 Sybase、 Microsoft SQL Server和Oracle数据库对象转换到 DB2通用数据库。使用 MTK,可以将数据类型、表、列、视图、索引、存储过程和触发器自动地转换成等价的 DB2数据库对象。MTK向数据库管理员(DBA)和应用程序程序员提供了使迁移任务自动化所需要的工具,而以前这些任务不但效率低下而且开销巨大。通过使用 MTK中的以下特性,您可以减少停机时间、消除人为错误,以及降低人工和与传统数据库迁移相关联的其它资源消耗。MTK可运行于 AIX、Linux、Solaris和 Windows操作系统上。

2. IBM Data Movement Tool

利用 DB2兼容特性和 IBM提供的免费数据迁移工具 Data Movement Tool,快速地将现有的 Oracle数据库对象转换到 DB2通用数据库。同时对应用中使用到的数据库访问语言以及接口进行转换,最终实现整个应用系统的完整迁移。

3. IBM Optim Development Studio

IBM Optim Development Studio,它为 Oracle、DB2和 Informix提供一个集成的数据库开发环境。Optim Development Studio在开发和测试 SQL和 XQuery查询、存储过程、Web服务和 Java数据访问层方面将生产力提高了 50%,而且允许在不同或者相同的数据服务器中的数据对象包、存储过程、表、用户自定义函数、用户自定义类型、视图、模式等的复制粘贴。

这三款工具都是来自于IBM官方的,大家有需要可以进去官方下载。

总结

以上只是简单的介绍了下迁移的流程和常用的工具,总的来说,迁移过程是一个复杂的过程,中间可能出现很多意想不到的情况,遇到问题,先查资料寻求解决方法,要有细心和耐心!我们在做迁移时,一定要做好备份,测试工作。而迁移工具只是一个辅助作用,如果单靠迁移工具是远远不够的。

二、db2如何使用存储过程拆分字符串

declare@inputStr varchar(max)set@inputStr='H,SH600,AAA,123,456,567,566,565,H,SH600,ABC,542,34,35,367,765,H,SH600,AAC,52,314,325,3867,7865'declare@divideFlag varchar(20)set@divideFlag='H,'declare@bnname varchar(8)declare@gpdm varchar(8)declare@gpcn intdeclare@ydate intdeclare@yopen intdeclare@yhigh intdeclare@substr varchar(200)declare@pos1 intdeclare@pos2 intdeclare@sql varchar(400)--如果字符串中有分隔符标记while CHARINDEX(@divideFlag,@inputStr,0)0begin set@pos1= CHARINDEX(@divideFlag,@inputStr,0) print'位置1'+cast(@pos1 as varchar) set@pos2= CHARINDEX(@divideFlag,@inputStr,@pos1+1) print'位置2'+ cast(@pos2 as varchar) if@pos20 begin set@substr= SUBSTRING(@inputStr,@pos1,@pos2-@pos1) print'截取处理串'+@substr set@inputStr= SUBSTRING(@inputStr,@pos2,len(@inputStr))--print@inputStr end else begin set@substr= SUBSTRING(@inputStr,@pos1,len(@inputStr)) print'截取处理串'+@substr set@inputStr='empty'--print@inputStr end--去掉开头的分割标记 set@substr=substring(@substr,CHARINDEX(@divideFlag,@substr,0)+len(@divideFlag),len(@substr)) print'去掉开头分割标记'+@substr if right(@substr,1)=',' begin set@substr= left(@substr,len(@substr)-1) print'去掉末尾的逗号'+@substr end--取得表名称 set@bnname= substring(@substr,1,charindex(',',@substr,0)-1) print@bnname--取表名称后面的字符串 set@substr=substring(@substr,charindex(',',@substr,0)+1,len(@substr)) print@substr--取得第一个字段 set@gpdm= substring(@substr,1,charindex(',',@substr,0)-1) print@gpdm--取得后面的字符串 set@substr=substring(@substr,charindex(',',@substr,0)+1,len(@substr)) print@substr set@gpcn= substring(@substr,1,charindex(',',@substr,0)-1) print@gpcn set@substr=substring(@substr,charindex(',',@substr,0)+1,len(@substr)) print@substr set@ydate= substring(@substr,1,charindex(',',@substr,0)-1) print@ydate set@substr=substring(@substr,charindex(',',@substr,0)+1,len(@substr)) print@substr set@yopen= substring(@substr,1,charindex(',',@substr,0)-1) print@yopen set@substr=substring(@substr,charindex(',',@substr,0)+1,len(@substr)) print@substr set@yhigh= substring(@substr,1,charindex(',',@substr,0)-1) print@yhigh set@substr=substring(@substr,charindex(',',@substr,0)+1,len(@substr)) print@substr--拼接插入的 sql字符串 set@sql='insert into'+@bnname+'(gpdm,gpcn,ydate,yopen,yhigh) values('''+@gpdm+''','+cast(@gpcn as varchar)+','+cast(@ydate as varchar)+','+cast(@yopen as varchar)+','+cast(@yhigh as varchar)+')' print@sqlend--拷贝到查询分析器执行,可以看到打印出的消息,拼接的字符串应该可以用

三、db2***存储过程***异常处理

存储过程异常的处理:

DECLARE handler-type HANDLER FOR condition handler-action

异常处理器类型(handler-type)有以下几种:

CONTINUE在处理器操作完成之后,会继续执行产生这个异常语句之后的下一条语句。

EXIT在处理器操作完成之后,存储过程会终止,并将控制返回给调用者。

UNDO在处理器操作执行之前,DB2会回滚存储过程中执行的SQL操作。在处理器操作完成之后,存储过程会终止,并将控制返回给调用者。

异常处理器可以处理基于特定SQLSTATE值的定制异常,或者处理预定义异常的类。预定义的3种异常如下所示:

NOT FOUND标识导致SQLCODE值为+100或者SQLSATE值为02000的异常。这个异常通常在SELECT没有返回行的时候出现。

SQLEXCEPTIOIN标识导致SQLCODE值为负的异常。

SQLWARNING标识导致警告异常或者导致+100以外的SQLCODE正值的异常。

如果产生了NOT FOUND或者SQLWARNING异常,并且没有为这个异常定义异常处理器,那么就会忽略这个异常,并且将控制流转向下一个语句。如果产生了SQLEXCEPTION异常,并且没有为这个异常定义异常处理器,那么存储过程就会失败,并且会将控制流返回调用者。

以下示例声明了两个异常处理器。 EXIT处理器会在出现SQLEXCEPTION或者SQLWARNING异常的时候被调用。EXIT处理器会在终止SQL程序之前,将名为stmt的变量设为"ABORTED",并且将控制流返回给调用者。UNDO处理器会将控制流返回给调用者之前,回滚存储过程体中已经完成的SQL操作。

清单3:异常处理器示例

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING SET stmt='ABORTED';

DECLARE UNDO HANDLER FOR NOT FOUND;

如果预定义异常集不能满足需求,就可以为特定的SQLSTATE值声明定制异常,然后再为这个定制异常声明处理器。语法如下:

清单4:定制异常处理器

DECLARE unique-name CONDITION FOR SQLSATE'sqlstate'

处理器可以由单独的存储过程语句定义,也可以使用由BEGIN…END块界定的复合语句定义。注意在执行符合语句的时候,SQLSATE和SQLCODE的值会被改变,如果需要保留异常前的SQLSATE和SQLCODE,就需要在执行复合语句的第一个语句把SQLSATE和SQLCODE赋予本地变量或参数。

通常,会为存储过程定义一个执行状态的输出参数(例如:poGenStatus)。

declare sqlcode integer default 0;

begin

declare continue handler for sqlexception set ret= sqlcode;

declare continue handler for sqlwarning set ret= sqlcode;

declare continue handler for not found set ret= sqlcode;

end;--异常的声明

--异常的处理

if sqlcode< 0 or sqlcode= 100 then

set O_RetCod= RetCode;

set O_RetMsg='CLN02:产品实例关联客户过程出错!';

insert into LOG.OPER_LOG_TAB(PROC_NAME,OBJ_TAB,REGION_COD,OPER_COUNT,ERR_CODE,DATA_TIME,OPER_TIME)

values('P_DW_CLEAN','GLOBAL TEMP',0,0,retcode,CHAR(last_3_mon_time),current TIMESTAMP);

return;

else

set RetCode= 0;

end if;