db2 存储过程迁移方法,db2存储过程迁移
大家在迁移数据库时,存储过程一般也要迁移过去,但一般有两个问题:
1. 很多存储过程有先后关系(存储过程调用存储过程),如果存储过程数量少,还能手动操作,如果量大,那真是要疯了。
2. 存储过程过大(行数过多),导致异常
这边有个方法,或许可以解决这个问题。
一. 导出存储过程
EXPORT TO G:/PROCUDURE/procudure.del OF del MODIFIED BY LOBSINFILE
SELECT 'SET CURRENT SCHEMA '||rtrim(procschema)||'@'||chr(10)||'SET CURRENT PATH = SYSIBM,SYSFUN,SYSPROC,'||rtrim(procschema)||' @'||chr(10)||text||chr(10)||'@'||chr(10)
FROM syscat.procedures WHERE PROCSCHEMA = 'ILS' ORDER BY create_time ;
执行以上导出语句,则是把schema为ils下面的存储过程导出为文件,因为有ORDER BY create_time,所以导出的顺序也是按照原有存储过程的顺序建立的。
执行完了,应该在G:/PROCUDURE看到两个文件
1. procudure.del
2. procudure.del.001.lob
如图:
会出现procudure.del.001.lob这个文件,因为我这边有存储过程太大(使用MODIFIED BY LOBSINFILE),所以导出为lob文件,这样不容易出错。
二. 导入存储过程
下一步当然是在其他db下面导入存储过程啦:
1. 命令行下进入到G:/PROCUDURE
2. 连接到要导入的db: connect to ilsdb user xxx用户 using xxx密码
3. db2 -td@ -vf procudure.del.001.lob
ok,顺便看看log,有没有报错。有报错,在执行一次(虽然是按照创建时间排序的,但不能保证有人后期修改过父存储过程,导致创建时间不对)。
导入过程见图:
打开后输入以下命令
...老兄,系统表啊,怎么能直接更新系统表呢?
迁移存储过程的方式应该是在源库用db2look 命令导出ddl脚本
然后在目标库执行ddl
1、db2 create database 数据库名 <-- 创建数据库
2、db2 connect to 数据库名 user 用户名 using 用户密码 <-- 连接数据库
3、db2 -tvf otpdb_v3_db2.sql <-- 为新建数据库建立表结构
4、db2 -td@ -f 存储过程文件绝对路径 <-- 导入存储过程,无错误会提示成功
4、调用存储过程:
Windows 下:db2 call 存储过程名(参数1,参数2)
AIX 下:db2 <-- 要先进入DB2,方可调用存储过程或执行SQL语句
db2=>call 存储过程名(参数1,参数2)
5、验证插入数据是否成功
Windows 下:db2 select count(*) from FTOTP_USERINFO
AIX 下:db2 <-- 要先进入DB2,方可调用存储过程或执行SQL语句
db2=>select count(*) from FTOTP_USERINFO
Windows 下:db2 select count(*) from FTOTP_TOKENINFO
AIX 下:db2 <-- 要先进入DB2,方可调用存储过程或执行SQL语句
db2=>select count(*) from FTOTP_TOKENINFO
6、db2 SELECT TOKEN, PUBKEY FROM FTOTP_TOKENINFO FETCH FIRST 10000 ROWS ONLY > 要保存文件的绝对全路径 <-- 从 DB2 中导出前一万条记录
windows - e.g. db2 SELECT TOKEN, PUBKEY FROM FTOTP_TOKENINFO FETCH FIRST 10000 ROWS ONLY > c:\abc.txt
AIX - e.g. db2 SELECT TOKEN, PUBKEY FROM FTOTP_TOKENINFO FETCH FIRST 10000 ROWS ONLY > c:\abc.txt <-- 注意:不能先进入DB2,执行查询与导出命令组合
7、db2 drop procedure 存储过程名 <-- 删除存储过程
8、db2 drop database 数据库名 <-- 删除指定名称的数据库
注,如果删除时提示有应用程序连接到这个数据库上,可以用如下命令断开所有应用程序的连接:
db2 force application all <-- 断开所有应用程序的连接