Saturday, September 13, 2008

SQL0572N Package "pkgname" is inoperative.

SQL0572N Package "" is inoperative.

Explanation:

The package "" is marked as inoperative and must be
explicitly rebound (without specifying RESOLVE CONSERVATIVE) before it
can be used. This package cannot be used because one or more
user-defined functions that it depends upon have been dropped.

User Response:

Explicitly rebind the named package using either the REBIND
(without specifying RESOLVE CONSERVATIVE) or the BIND command.

sqlcode : -572

sqlstate : 51028

เมื่อมีการใช้งาน DB2 ไปสักพักโดยมีการ drop, create object เรื่อยๆ หรือ restore database
เรามักจะพบกับปัญหาที่เรียกว่า inoperative object นั้นหมายความว่า object นั้นๆจะไม่สามารถทำงานได้
ทั้งๆที่ object นั้นยังคงมีอยู่ใน database ก็ตาม
ปัญหานี้ก่อให้เกิดความเสี่ยงพอสมควรเมื่อเราได้ launch ระบบเราไปให้ลูกค้าได้ใช้งานแล้ว
หาก เราไม่ทำการตรวจสอบก่อน เราอาจจะต้องพบกับ error ที่เกิดขึ้นจากการที่ application เราไม่สามารถ execute object ข้อ database ได้ ดังนั้นเมื่อทำการ restore database ของ db2 ควรตรวจสอบก่อนเสมอว่ามี object ใดบ้างใน database ที่ invalid โดยสามารถตรวจสอบได้จาก query statement ต่อไปนี้

SELECT * FROM SYSCAT.PACKAGES WHERE VALID != 'Y'

และเมื่อพบแล้วว่า packages ของ object ไหนที่ invalid เราจะต้องทำการ rebind ใหม่ เพื่อให้ object ใน
packages นั้นๆสามารถกลับมาใช้งานได้อีกครั้ง ด้วยการรัน db2 command ดังต่อไปนี้

db2 rebind <ชื่อpackage>

หรือสามารถเขียน query statement generate คำสั่งได้ดังนี้

SELECT
'DB2 REBIND ' || RTRIM(PKGSCHEMA) || '.' || SYSCAT.PACKAGES.PKGNAME
FROM
SYSCAT.PACKAGES
WHERE
SYSCAT.PACKAGES.VALID != 'Y'
ORDER BY
PKGSCHEMA,SYSCAT.PACKAGES.PKGNAME

แล้วนำคำสั่งที่ได้ไปรันใน db2 command window

สุดท้ายถ้ายังไม่สามารถกู้กลับมาได้ แนะนำให้ re-compile object ใหม่เลยครับ
ใช้งานได้แน่นอน



ปล. ในทางปฎิบัติ ทุกครั้งที่มีการ update table structure เราควร reoganize databaseด้วย


No comments: