2008年(8065)
分类: 服务器与存储
2008-05-18 13:05:13
产品:DB2 UDB
平台:跨平台
版本:v8.1,v8.2
在DB2中,可以通过查询系统表的视图来实现为对指定的存储过程查找其对应的程序包名称的任务。但由于v8.2对于创建存储过程不再需要C编译器的修改,使得系统表的字段定义发生了相应的修改,从而导致在v8.1和v8.2中实现这一功能查询语句的不同。
在DB2 v8.2之前的版本中,为得到程序包与存储过程名称的对照表,可通过如下SQL查询语句,借助SYSCAT.PACKAGES和SYSCAT.PROCEDURES两个系统视图来实现:
select char(procname,20) as procname, char(pkgname,20) as pkgname from syscat.packages a, syscat.procedures b where a.pkgname = substr(b.implementation,1,8)
例如当完成了 sqllib/samples/sqlproc/nestif.db2 中定义的存储过程BUMP_SALARY_IF的创建后,执行上述语句,可得到如下结果:
PROCNAME PKGNAME
-------------------- --------------------
BUMP_SALARY_IF P1121101
1 record(s) selected.
其中的PKGNAME返回的P1121101即为存储过程BUMP_SALARY_IF对应的程序包名称。
而在v8.2中,如果仍使用上述语句,则无法返回正确的程序包名,其输出结果为:
PROCNAME PKGNAME
-------------------- --------------------
0 record(s) selected.
这是由于从v8.2开始,DB2存储过程的创建不再需要C/C++编译器了,也就是说存储过程的创建将由DB2自身的解释器来完成,而无需C/C++ 编译器了。由于这一修改,存储过程对应的程序包的名称也相应地从SYSCAT.PROCEDURES系统视图中移出,因此导致上述查询语句未能正确地返回结果。要在 v8.2 中实现获取程序包与存储过程名称的对照表,可改用以下SQL查询语句:
select char(procname,20) as procname, char(b.bname,20) as pkgname from syscat.procedures a, syscat.routinedep b where a.specificname = b.routinename
对于上述的样本程序nestif.db2中存储过程在 v8.2 下的创建,其返回结果为:
PROCNAME PKGNAME
-------------------- --------------------
BUMP_SALARY_IF P1353951
1 record(s) selected.
即PKGNAME返回的P1353951为存储过程BUMP_SALARY_IF对应的程序包名称。