初接触DB2,工作中遇到些问题,首先是-818的错误,总结出来与大家分享。
一方面,sqc文件名长于8个字符(不包括扩展名):
图1.1 源程序名mainforexample.sqc
图1.2 未指定包名产生的包名为MAINFORE
DB2的嵌C编程中,所有的.sqc文件都会在DB2数据库中生成一个PACKAGE包,这个程序包的包名是该文件名的前八个字符,如果有两个及以上前8个字符重的,则只有最后一个绑定的包存在,而可执行文件在执行时首先是核对可执行文件和程序包的信息,如果二者的信息不符,则退出程序的执行,产生-818错误。
解决方案:
为避免这种错误,我们可以有如下两种方法,一是确保.sqc的文件名小于8位(不包括.sqc这四个字符)。二是指定在DB2中产生的程序包的包名,通过自己指定一个唯一值来避免-818错误:
prep $(filename).sqc package using $(filename),通过红色字体标示的部分指定包名。
图1.3 在makefile中指定包名为文件名
图1.4 指定包名后生成新的包名MAINFOREXAMPLE
另一方面,sqc文件名不大于8字符,或指定了包名,但仍报-818:
图2.1 包的时间戳,比较一下时间
数据库中,程序绑定数据库的时间会在编译的时候被修改,如果运行的程序不是这次编译的.sqc生成的程序,那么被重新绑定的数据库在这个程序访问时也会报-818的错误。
解决方案:
图2.2 用老程序访问新被绑定PACKAGE的数据库报-818错误
1. 不能多个人同时编译操作同一.sqc文件,这样容易造成,A编译了之后PACKAGE绑定的时间是a,B编译了之后package绑定的时间又变为b。
2. 更广泛一点来说,不能运行老的程序访问新被绑定PACKAGE的数据库。