动态sql、静态sql、package
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学了ORACLE的人,如果去理解DB2的动态和静态,简直要发狂.
在ORACLE中,select * from table where id=1, 这便是静态
下面便是动态:
declare b varchar(100)
b :='select * from table where id=:1'
execute immediate b using 1
一看就知道,所谓的静态是一开始就知道SQL是什么,动态是开始不知道的,只有在执行的时候,execute immediate才知道原来where id=1.
但是在DB2,这种概念完全改变.
select * from table where id=1 是什么态?好像是静态,其实在DB2中这是动态SQL.
如果上面这个SQL都是动态,那何为静态呢?
放开一点思维,在DB2中,所谓的动态,是指在执行的时候才编译. 比如你输入select * from table where id=1到cli中,SQL开始执行,自然就要编译。这便是DB2中的动态概念.和SQL 没有任何关系,只和编译有关系.
那么静态是什么,问到这个问题,自然有很多人会问什么是bind一个道理. 因为没有理解静态,所以无法理解BIND.
静态是指,SQL之前就编译好了. 已经生成了计划,这便引出了DB2 package的概念, package 便是存放了计划的东东. 总之package放了SQL执行一些必要条件. 这东西便是bind产生的.
搜索一下google就知道,解释DB2的静态和动态,大部分是这么说的,动态是执行的时候编译的,需要perpare, 静态是指预先编译,生成了package.
DB2中有Package的概念,它是存储了你在相应的应用中使用的SQL语句的数据访问计划(Access Plan)
今天所做的程序最后封版,封版前觉得程序有一个地方让我很不爽,于是就进行了一下修改,改动其实很小,只是在if里面增加了一个判断条件,结果程序运行的时候开始报数据库系统错误,错误内容如下:
[DB2/NT] SQL0805N 找不到程序包"NULLID.SYSLH203 0X5359534C564C3031"。SQL STATE=51002
到网上查找错误的原因,结果关于这方面的内容少之又少,Google中只找到两个网页,里面倒是提供了解决方案,不过原因不是很详细。继续搜索,最后在IBM官方网站上找到一个还算清楚的解释:
Solution
Depending on the type of statement you are executing, DB2 will use a particular package on the server. By default, DB2 creates three packages for each type of p ackage. In this case NULLID.SYSLH2yy is reserved for statements with CURSORHO LD on and isolation level Cursor Stability. The package SYSLH203 means that DB2 is looking for the 4th package (200 is first, 201 is second, etc) of this type, but it does not exist. You can create more packages on the server by connecting to t he database and issuing the following bind command from the /sqllib/bnd direct ory:
db2 bind @db2cli.lst blocking all grant public sqlerror continue CLIPKG 5 Note: CLIPKG 5 will create 5 large packages, and will give you the package that your application is looking for, as well as one more in this case.
大致的意思是说DB2在执行SQL语句的时候会使用内部定义的包(package)来保持不同级别的游标的稳定性,包的名字就是“NULLID.SYSLH2XX”。DB2里面默认的时候会创建3个这样的包即S YSLH200, SYSLH201, SYSLH202,而当你的程序报“找不到程序包”的错误,并且程序包的名字的
序号大于SYSLH202,也就说明DB2默认的包不够用了,DB2要求使用更多的包,但是这些包在DB2中并没有创建,因此DB2抛出了异常。
要解决这个错误有两种方法:一是执行上面的英文段中的粗体部分的命令,把DB2的包的个数扩大到5个,这样DB2就可以找到它需要的包;二是调整你的程序,优化结构,使得DB2不会用到多于3个的包,当然,这将会使你经历一个非常艰难的调试时刻。
至于我吗,由于是在封版时刻,自然选择最简单的处理方式——把错误的地方再改回来,虽然有点取巧,但是至少不会产生对数据库修改的需求:-)