内容摘要:本文以 DB2 开发人员的角度介绍了在 DB2 存储过程开发中需要注意的事项和技巧。新手如果能够按照本文介绍的最佳实践来开发存储过程,可以避免一些常见的错误,从而编写出高效的程序。本文从初始化参数、游标、异常处理、临时表的使用以及如何寻找并 rebind 非法存储过程等常见问题进行了着重讨论,并且给出了示例代码。
可以看出在一个连接里面,多次调用存储过程get_temp_table,也不会出现问题。临时表在某些情况下也是需要避免使用的。大家知道临时表是存放在内存中的,如果一个临时表有上万或者十几万条记录,同时程序的并发数很大,那么在内存中建立的临时表耗费的资源就很庞大,此时数据库的性能会急剧下降,甚至会导致数据库崩溃。因此,大家在使用临时表的时候,需要考虑它对资源的耗费,避免盲目使用临时表。
最佳实践 6:寻找并rebind 非法的存储过程
存储过程会因为其涉及和引用的对象发生了改变而导致其非法(invalid),例如:修改了表结构,导致引用该表的存储过程非法,或者重新编译一个存储过程,会使调用这个存储过程的父存储过程非法。此时我们需要对非法的存储过程重新编译(rebind)。但是,对非法的存储过程进行rebind的时候,需要确定其引用的对象是合法的,否则非法的存储过程也不能rebind成功。
这里我们介绍一下发现和rebind非法存储过程的方法。我们是通过判断SYSCAT.routines中VALID字段的值来查找非法存储过程的。下面是查找非法存储过程的一段代码:
清单12:查找非法存储过程
SELECT
RTRIM(r.routineschema) || '.' || RTRIM(r.routinename) AS spname ,
' ( '|| RTRIM(r.routineschema) || '.' || 'P'||SUBSTR(CHAR(r.lib_id+10000000),2)||' )'
FROM
SYSCAT.routines r
WHERE
r.routinetype = 'P'
AND ((r.origin = 'Q' AND r.valid != 'Y')
OR EXISTS (
SELECT 1 FROM syscat.packages
WHERE pkgschema = r.routineschema
AND pkgname = 'P'||SUBSTR(CHAR(r.lib_id+10000000),2)
AND valid !='Y'
)
)
ORDER BY
spname;
获得的结果如下:
清单13:查找非法存储过程的结果
SPNAME
----------------------------------
TEST.DEMO_INFO_8 (TEST. P3550884)
可以使用下面的命令rebind它们
清单14:Rebind 非法存储过程语法
rebind package packagename resolve any@
Packagename就是查询结果中括号里的值。例如,如果rebind上面查出来的存储过程。我们只需要执行下面语句
清单15:Rebind 非法存储过程
rebind package TEST.P3550884 resolve any@
当然,如果此存储过程程序本身有问题,需要先修改存储过程代码后再进行编译。
类似的,通过下面的代码可以获得非法的视图。
清单16:获得非法的视图
SELECT
RTRIM(viewschema) || '.' || RTRIM(viewname) AS viewname
FROM
SYSCAT.views
WHERE
valid = 'X'
ORDER BY
viewname;
结束语
本文介绍了我们在 DB2 存储过程开发中经常用到的一些技巧。同时这些技巧也是编写优秀存储过程的基本要求。本文介绍的一些技巧只是揭开了高效使用 DB2 的冰山一角。DB2 为我们提供了丰富和强大的功能。在使用 DB2 的时候,我们应当深入理解其原理,找出更多的最佳实践与大家分享。
来源:ibm 作者:常伟 责编:豆豆技术应用