“假如生活欺骗了你/不要悲伤/找个程序员/告诉他/需求变了”一个热爱代码的程序猿修炼之路
今天给一个java类加了几个字段，没想到转为json字符串的时候报错了，定位了一下原因，觉得这种情况遇到的应该不多，又想起来很久没写博客了，于是就把遇到的问题以及定位过程记下来，省了以后遇到的人再花时间定位了调用的是JSON.toJSONString(Object object)方法，具体的报错信息如下：Caused by: com.alibaba.fastjson.JSONException: write javaBean error at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:234) at Serializer_5.write1(Unknown Source) at Serializer_5.write(Unknown Source) at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:369) at com.alibaba.fastjson.JSON.toJSONString(JSON.java:393) at com.alibaba.fastjson.JSON.toJSONString(JSON.java:567) at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:689) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:55) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at ... 81 common frames omitted Caused by: com.alibaba.fastjson.JSONException: create asm serializer error, class class com.feifei.bean.TestBean at com.alibaba.fastjson.serializer.SerializeConfig.createJavaBeanSerializer(SerializeConfig.java:113) at com.alibaba.fastjson.serializer.JSONSerializer.getObjectWriter(JSONSerializer.java:527) at com.alibaba.fastjson.serializer.ListSerializer.write(ListSerializer.java:81) at com.alibaba.fastjson.serializer.ObjectFieldSerializer.writeValue(ObjectFieldSerializer.java:118) at com.alibaba.fastjson.serializer.ObjectFieldSerializer.writeProperty(ObjectFieldSerializer.java:67) at com.alibaba.fastjson.serializer.JavaBeanSerializer.write(JavaBeanSerializer.java:216) ... 94 common frames omitted Caused by: java.lang.ClassFormatError: JVMCFRE042 bytecode array size > 65535; class=Serializer_57, offset=53261 at java.lang.ClassLoader.defineClassImpl(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:275) at com.alibaba.fastjson.util.ASMClassLoader.defineClassPublic(ASMClassLoader.java:42) at com.alibaba.fastjson.serializer.ASMSerializerFactory.createJavaBeanSerializer(ASMSerializerFactory.java:287) at com.alibaba.fastjson.serializer.ASMSerializerFactory.createJavaBeanSerializer(ASMSerializerFactory.java:36) at com.alibaba.fastjson.serializer.SerializeConfig.createASMSerializer(SerializeConfig.java:78) at com.alibaba.fastjson.serializer.SerializeConfig.createJavaBeanSerializer(SerializeConfig.java:106) ... 99 common frames omitted 可以看到，代码在执行到ASMClassLoader.defineClassPublic这个方法时报错了，报的错是：JVMCFRE042 bytecode array size > 65535 字节数组超长,这个长度65535，很显然是长度规定了2的16次方（65536），也就是64K大小。再来看看ASMClassLoader这个类，这个类继承了java的类装载器ClassLoader，fastjson内嵌了ASM框架来动态生成类；public class ASMClassLoader extends ClassLoader { 并且报错的方法其实就是调用了ClassLoader的类定义方法defineClass，本质上调用的是JVM的native功能public Class<?> defineClassPublic(String name, byte[] b, int off, int len) throws ClassFormatError { Class<?> clazz = defineClass(name, b, off, len, DOMAIN); return clazz; } 这里其实也就是传的需要生成的类的字节码，在这里也就对应着我们需要转换成JSON串的对象类的字节码，所以这个报错应该就是对象类字节码超长了,也就是类里面的东西太多了,试着删掉这个bean里的一些变量，测试一把，果然不报错了。那到底是什么太长了呢？这也好办，继续写个单元测试，把ASMSerializerFactory类拷出来，把字节码输出看看单元测试：@Test public void test(){ try{ this.asmSerial(TestBean.class); }catch(Exception e){ System.out.println(e); } } private void asmSerial(Class<?> clazz) throws Exception{ ASMSerializerFactory fac = new ASMSerializerFactory(); fac.createJavaBeanSerializer(clazz); } 在拷出来的ASMSerializerFactory类的createJavaBeanSerializer方法中新增输出逻辑：byte[] code = cw.toByteArray(); // 输出class文件 File outputFile = new File("C:\\Users\\feifei\\Desktop\\ooo\\out.class"); FileOutputStream outputFileStream = null; try { outputFileStream = new FileOutputStream(outputFile); } catch (FileNotFoundException e) { } outputFileStream.write(code); System.out.println("code:length: " + code.length); 执行一把，果然报错了，而且class文件也成功生成了，先看看控制台输出：[TestNG] Running: C:\Users\feifei\AppData\Local\Temp\testng-eclipse-1963807168\testng-customsuite.xml code:length: 191423 FAILED: test java.lang.ClassFormatError: Invalid method Code length 65904 in class file Serializer_1 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at com.alibaba.fastjson.util.ASMClassLoader.defineClassPublic(ASMClassLoader.java:42) at ASMSerializerFactory.createJavaBeanSerializer(ASMSerializerFactory.java:299) at ASMSerializerFactory.createJavaBeanSerializer(ASMSerializerFactory.java:42) at tt.asmSerial(tt.java:19) at tt.test(tt.java:11) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) 可见报错更加细化了java.lang.ClassFormatError: Invalid method Code length 65904 in class file Serializer_1 这个报错意思更加明显了，方法的长度不合法，这个方法的长度是65904，结合上面报出来的大于65535，那么问题就很明显了，java里规定了类的一个方法最大不能超过64K。我们继续打开刚刚生成的class文件，可以看到，我们bean里面的字段都在里面，而里面最大的方法是write和write1，分别占13000多行，所以应该就是这两方法超长了。至此，问题就定位清晰了，就是bean里面字段太多，导致序列化后，生成class文件的方法超长，也就导致转为json字符串失败了，这个除了拆分bean，貌似也没什么好办法了，而且这个bean确实太大了，拆开可读性也会好很多
之前从typecho换到了hexo,用了多说的评论。现在多说要挂了，不想用Disqs，网易云跟帖之类的插件了，于是换回typecho.尴尬地发现之前博客的备份直接用就行了……也就是说这一年多竟然没写一篇博客……我自己也是无语了～除了懒，有点忙之外，主要精力还是放在主业java上了，毕竟是吃饭的家伙；而且随着一门语言逐渐深入进去，越发觉得自己懂的太少，反而不知道博客能写点什么了不过折腾还是继续，现在抛开ionic，继续折腾ReactNative，多学点东西，拓展一下眼界还是很有必要的～生命不息，折腾不止～
之前一直用centOS,试用了一次Ubuntu感觉这是一个对新手很友好的系统，用apt-get安装环境很方便，前端时间换了VPS，重新安装环境很快就搞定了，做个笔记，下次再配置就不用再找了nignx安装Ubuntu14.04默认安装是是1.4.6版本的，而新的稳定版本都到1.8了，所以我要装个更加新的稳定版本，参考nginx的官方教程http://nginx.org/en/linux_packages.html#stable先下载一个key，http://nginx.org/keys/nginx_signing.key添加到apt里apt-key add nginx_signing.key 再修改/etc/apt/sources.list文件，新增配置：deb http://nginx.org/packages/mainline/ubuntu/ trusty nginx deb-src http://nginx.org/packages/mainline/ubuntu/ trusty nginx 保存之后，执行apt-get update apt-get install nginx 这样nginx就一路安装完毕了安装完的nginx配置在/etc/nginx/conf.d/目录jdk安装ubuntu默认安装的jdk是openjdk，安装的话一行命令就可以apt-get install openjdk-7-jdk 不过我想安装orcal的jdk，目前网上很多通过PPA的方式安装的，命令如下apt-get install python-software-properties add-apt-repository ppa:webupd8team/java apt-get update apt-get install oracle-java7-installer 或者你还可以通过下载官方源码包的方式来安装.首先去orcal官网下载需要的jdk版本，我下载的是7u80,http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html上传到服务器后，解压tar -xvf jdk-7u80-linux-x64.tar.gz 创建jvm文件夹，用来安装jdkmkdir /usr/lib/jvm mv ./jdk1.7.0_80 /usr/lib/jvm/ 接下来执行命令：update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.7.0_80/bin/java" 1 update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.7.0_80/bin/javac" 1 update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/lib/jvm/jdk1.7.0_80/bin/javaws" 1 这几个命令的作用是把这个jdk的优先级设置为1，优先级设的很低其实就是为了新安装的这个jdk不会取代当前默认的jdk版本,以便后面调整接下里继续执行命令，设置文件夹权限chmod a+x /usr/bin/java chmod a+x /usr/bin/javac chmod a+x /usr/bin/javaws chown -R root:root /usr/lib/jvm/jdk1.7.0_80 接下来可以分别执行以下命令选择需要的默认JDK版本，root@feifei:~# update-alternatives --config java There are 2 choices for the alternative java (providing /usr/bin/java). Selection Path Priority Status ------------------------------------------------------------ * 0 /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java 1071 auto mode 1 /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java 1071 manual mode 2 /usr/lib/jvm/jdk1.7.0_80/bin/java 1 manual mode Press enter to keep the current choice[*], or type selection number: 2 update-alternatives: using /usr/lib/jvm/jdk1.7.0_80/bin/java to provide /usr/bin/java (java) in manual mode javac和javaws也是一样的类似操作：update-alternatives --config javac update-alternatives --config javaws 最后设置一下JAVA_HOME打开并编辑文件/etc/environment，加入刚刚配置的JDK地址：JAVA_HOME="/usr/lib/jvm/jdk1.7.0_80"保存退出，执行重载命令source /etc/environment 这样就搞定了,查看下JAVA_HOME是否正确设置root@feifei:~# echo $JAVA_HOME /usr/lib/jvm/jdk1.7.0_80 最后我们看下版本，就是我们装好的orcal jdk了root@feifei:~# java -version java version "1.7.0_80" Java(TM) SE Runtime Environment (build 1.7.0_80-b15) Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode) tomcat安装tomcat7的安装就很简单了，直接调系统命令即可apt-get install tomcat7 安装完成后根据服务器配置，简单配置下最大内存占用打开并编辑/etc/default/tomcat7文件JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom -Djava.awt.headless=true -Xmx512m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC" 保存后重启tomcat即可service tomcat7 restart tomcat的webapp文件夹位于/var/lib/tomcat7/webapps
之前做个小移动客户端，图方便快捷，使用了ionic来开发，整体还是挺顺畅的，就是不太习惯yong其中碰到一些小坑，都是一些知道了就很简单，不知道就很蛋疼的东西，所以做个笔记，帮初次接触ionic和angularjs的人省点事儿1.ionic中的CORS（跨域）问题这个问题一般刚接触ionic的都会遇到，在浏览器中通过ionic serve调试的时候，请求api时会报错XMLHttpRequest cannot load http://localhost:8080/api/p/1. No'Access-Control-Allow-Origin' header is present on the requestedresource. Origin 'http://localhost:8100' is therefore not allowedaccess.网上也有不少解决方案，这边只提供一个最简单的直接安装一个chrome插件，名字就叫：“Allow-Control-Allow-Origin: *”地址在 https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi然后直接用插件打开cors就行了2.$resource的结果获取提示未定义（undefined）的问题如果定义了一个servive：.service('DemoService',['$q','$resource', 'Constants', function($q,$resource, Constants) { var postResource = $resource(Constants.API.baseUrl+'/p/:pid', {pid: '@pid'}); var post = { getPostDetail: function(_pid) { return postResource.get({pid:_pid}); } } return post; }]) 然后在controller中调用获取数据并使用var postDetail = DemoService.getPostDetail($stateParams.pid); 假设返回的是类似于{"status":"Y","message":"成功","postInfo":{"id":113,...}} 这样的json串,如果我们直接取值postDetail.status这样就会报错，提示undefined，从而取不到值，因为$resource的结果是异步返回的，直接调用方法并不能立即就取到返回值。而如果直接$scope.postDetail = postDetail.postInfo的话，页面是可以正常显示的，因为当数据没有返回之前，模板引擎不会渲染，一旦异步数据获取完成，会自动触发模板引擎的渲染机制把数据呈现到视图中。所以如果我们要在controller中获取返回值的话，只要这么写就行了DemoService.getPostDetail($stateParams.pid).$promise.then( function(successData) { //获取成功后处理 var detail = successData.status; }, function(failData) { //获取失败后处理 }); 3.ion-refresher和ion-infinite-scroll调用多次的问题一个页面上，我同时使用了ion-refresher和ion-infinite-scroll用来下拉刷新当前数据以及到底自动获取下一页内容。偶然发现当ion-refresher下拉刷新之后，页面内容刷出来的一瞬间，infinite的方法被调用了多次，因为页面内容当时还没刷出来，列表一片空白，所以此时页面其实就是已经默认到了最底部了，于是就触发了获取下一页的方法解决方法也很简单，就是设置一下immediate-check的值<ion-infinite-scroll ng-if="!noMorePage" immediate-check="false" on-infinite="queryNext()" distance="1%"> </ion-infinite-scroll> 这个设置官方解释是Whether to check the infinite scroll bounds immediately on load就是设置是否在页面加载后立刻触发on-infinite的方法，设为false后，则只有滚动到页面边缘时才会触发，即使页面加载出来已经到最底部，不滚动一下的话也是不会触发的至于$scope.$broadcast('scroll.refreshComplete');和$scope.$broadcast('scroll.infiniteScrollComplete');广播下拉刷新和滚动触发的停止事件就不多说了，官方都有说明4.list点击跳转后返回，list滚动到了顶部(不知道算不算坑)list跳转后返回无法保持原位置，而是回到了页面顶部，翻了官方论坛不少帖子，试了不少次，后来把ion-content上的overflow-scroll="true"去掉貌似就行了～5. $http.post表单提交的问题ionic的表单提交，用$http.post之后发现后端取不到表单值，google之后找到一个解决方案，直接贴下代码，放到.config里就行// Use x-www-form-urlencoded Content-Type $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8'; /** * The workhorse; converts an object to x-www-form-urlencoded serialization. * @param {Object} obj * @return {String} */ var param = function(obj) { var query = '', name, value, fullSubName, subName, subValue, innerObj, i; for(name in obj) { value = obj[name]; if(value instanceof Array) { for(i=0; i<value.length; ++i) { subValue = value[i]; fullSubName = name + '[' + i + ']'; innerObj = {}; innerObj[fullSubName] = subValue; query += param(innerObj) + '&'; } } else if(value instanceof Object) { for(subName in value) { subValue = value[subName]; fullSubName = name + '[' + subName + ']'; innerObj = {}; innerObj[fullSubName] = subValue; query += param(innerObj) + '&'; } } else if(value !== undefined && value !== null) query += encodeURIComponent(name) + '=' + encodeURIComponent(value) + '&'; } return query.length ? query.substr(0, query.length - 1) : query; }; // Override $http service's default transformRequest $httpProvider.defaults.transformRequest = [function(data) { return angular.isObject(data) && String(data) !== '[object File]' ? param(data) : data; }]; 6. 在android上，开机图片（SplashScreen）不显示，只显示了2，3秒空白这个问题官方论坛上讨论的比较多，各个人解决方案也不一样，有说把config.xml里的SplashScreenDelay设置时间延长的；有说用了Crosswalk之后不兼容的，因为我也没用Crosswalk，我自己不显示开机画面的原因是：“没装splashscreen插件”解决方案：直接安装插件后重新编译，然后就搞定了ionic plugin add org.apache.cordova.splashscreen 常用命令：ionic lib update 更新ionic库 ionic platform add ios 添加ios平台 ionic platform add android 添加android平台 ionic build ios 编译为ios app ionic build android 编译为android app
唔，发现一晃又是好几个月没写博客了……神说，这里太荒芜了，于是就有了这篇杂记。这段时间比较忙(懒)，手上压了一些东西要做，当然拉，都是自己折腾着玩的，所以基本三天打鱼两天晒网。继而导致手上压的东西越来越多，自己都有点不记得了……干脆写个博客絮叨絮叨，一举两得~上个月把服务器从美国换到了日本，在Linode上连试了7，8个IP，总算找到一个能用的日本节点，顺便把系统从centOS换到了Ubuntu。话说之前用centOS觉得挺方便的，一直听说Ubuntu操作简单，于是就趁这个机会换着试试，觉得果然没有最方便，只有更方便，装环境比之前centOS更简单了。切到日本节点跑了两星期之后发现挺稳定，ping值更是降了一个数量级，于是果断把原先的美国节点删掉了（都是钱呐~~）接下来计划要做的：1.给自己折腾的小站做个移动端。当然拉，不是原生的，原生工作量太大，真搞起来估计是上不了线了。之前发现Ionic貌似挺不错，现在手机性能也越来越好，这种用JS和HTML5开发的混合移动应用性能比起前两年好的不是一点半点，小站功能又不多，访问量又不大，综合权衡一下，就决定用Ionic开发Android和IOS的客户端了2.自己简单封装的第三方登录包增加微信登录功能。之前coding.net做活动，提代码送抱枕的时候，为了拿个抱枕，把自己之前折腾的一个基于java的，整合QQ，微博，豆瓣的功能提取出来放到coding上去赚了个抱枕回来，然后就一直没更新了……记得当时github上也开了个同名项目，连代码都懒得再传一份了（我的懒成啥样……），好吧，其实还是觉得git用着不太习惯唔，希望能赶紧弄好吧
之前vps上安装了jetty跑了几个小站，不过当时没配开机自动启动。今天升级系统Glibc堵幽灵漏洞的时候，需要重启，为了重启后不要手动启动jetty，google了一下，把jetty加入开机自启了。查看一下系统的自启列表，里面已经有一些随机自启的程序了[root@localhost ~]# chkconfig --list mysql 0:关 1:关 2:开 3:开 4:开 5:开 6:关 nginx 0:关 1:关 2:开 3:开 4:开 5:开 6:关 把jetty加入自启动（注意jetty的路径）ln -s /opt/jetty/jetty.sh /etc/init.d/jetty chkconfig --add jetty chkconfig jetty on 当然，JETTY_HOME是要配置的～vim /etc/init.d/jetty 加入一条JETTY_HOME的路径配置 JETTY_HOME=/opt/jetty 完成后再看一下，jetty已经在自启列表里了[root@localhost jetty]# chkconfig --list jetty 0:关 1:关 2:开 3:开 4:开 5:开 6:关 这样下次开机的时候jetty就可以自动启动啦,并且可以通过service jetty start 来启动jetty了
今天突然监控宝报警，网站无法访问了，自己一上，果然上不了，提示数据库连接错误由于VPS上除了博客还有其他的两个站，一上，都没法访问，其中一个java站报错：com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections" 我就纳闷了，这几个站平均一天也就那么几十个人访问，怎么可能连接数过多，难道被人攻击了？于是上Linode后台一瞅，流量，CPU，IO都没啥异常啊，那能有啥问题！一怒之下，重启了mysql……发现还是不行，不过这次报错变成了：org.springframework.jdbc.UncategorizedSQLException: ### Error querying database. Cause: java.sql.SQLException: Got error 28 from storage engine ### The error may involve defaultParameterMap ### The error occurred while setting parameters ### Cause: java.sql.SQLException: Got error 28 from storage engine ; uncategorized SQLException for SQL []; SQL state [HY000]; error code [1030]; Got error 28 from storage engine; nested exception is java.sql.SQLException: Got error 28 from storage engine 搜索之，说是磁盘空间不足导致的……我信了你的邪，总共24G的空间，才放了三个小站，怎么呢可能空间不足……ssh上去查看了一把，当时我就震惊了！神马玩意耗了我24个G……联想到mysql的报错，到mysql目录下一查，果然发现一堆奇怪的东西……继续搜索之，说这些都是mysql的数据库操作日志，数据库的操作命令，执行信息都会被存到日志里来，防止哪天数据库出问题了可以来查查原因啊神马的。考虑到空间和实际项目，还是删掉吧……果然删掉之后，所以的站都能正常访问了～最后，为了避免再次发生这种日志撑报磁盘空间的事情，直接把mysql的配置文件 my.cnf 里面的log-bin这一行注释掉，重启一下mysql就OK啦！
放在GODDAY上的域名被盗了，在一封确认邮件都没发给我的情况下，PUSH走了域名，改了域名的注册人信息。最神奇的是，我的账号的密码和注册邮箱都被改了，这竟然也没有任何的邮件确认！！最终只有域名被转走的一份通知邮件！！是的，只是通知邮件，不是确认邮件，告诉你有这么一件事，就完了。真是屎一样的GODDAY，虽然那几个域名只是自己做个小站娱乐娱乐，但是也是好几年的米了，有点感情了。看着被盗了然后解析到各种博彩，垃圾站上，真心纠结------2014年10月30日更新-----给GODADDY的undo和change部门发了邮件，没人理……本来都放弃了，突然过了两周给了来了封邮件：竟然说检测到我账户异常，给我恢复了……赶紧登上去，改密码，改whois，改解析。最后看到正常解析到自己站上还觉得有一种莫名其妙的不真实感……于是决定等保护期一过立马转走，这么一折腾，本来流量就不多的站，现在流量更少了……
整理了一下DB2的数据库错误代码，当然，内容是网上找的，自己整理了下格式，看起来舒服点……没办法，强迫症表示网上那些参差不齐的排版每次看到都很纠结……整理如下 ↓↓↓↓↓↓↓↓↓ sqlcode sqlstate 说明 +012 01545 未限定的列名被解释为一个有相互关系的引用 +098 01568 动态SQL语句用分号结束 +100 02000 没有找到满足SQL语句的行 +110 01561 用DATA CAPTURE定义的表的更新操作不能发送到原来的子系统 +111 01590 为2型索引设置了SUBPAGES语句 +117 01525 要插入的值的个数不等于被插入表的列数 +162 01514 指定的表空间被置为检查挂起状态 +203 01552 使用非唯一的名字来解决命名的限定列 +204 01532 命名的对象未在DB2中定义 +206 01533 命名的列不在SQL语句中指定的任何表中存在 +218 01537 因为SQL语句引用一个远程对象，不能为该SQL语句执行EXPLAIN +219 01532 命名的PLAN TABLE不存在 +220 01546 不正确定义PLAN TABLE，检查命名列的定义 +236 01005 SQLDA中的SQLN的值至少应于所描述的列的个数一样大 +237 01594 至少有一个被描述的列应该是单值类型，因此扩展的SQLVAR条目需要另外的空间 +238 01005 至少应有一个被描述的列是一个LOB，因此扩展的SQLVAR条目需要另外的空间 +239 01005 至少应有一个被描述的列应是单值类型，因此扩展的SQLVAR条目需要另外的空间 +304 01515 该值不能被分配给宿主变量，因为该值不再数据类型的范围之内 +331 01520 不能被翻译的字符串，因此被设置为NULL +339 01569 由于与DB2 2.2版本的子系统连接，所以可能存在字符转换问题 +394 01629 使用优化提示来选择访问路径 +395 01628 设置了无效的优化提示，原因代码指定了为什么，忽略优化提示 +402 01521 未知的位置 +403 01522 本地不存在CREAT ALIAS对象 +434 01608 在DB2未来发布的版本中将不支持指定的特性，IBM建议你停止使用这些特性 +445 01004 值被CAST函数截取 +462 01Hxx 由用户定义的函数或存储过程发出的警告 +464 01609 命名的存储过程超出了它可能返回的查询结果集的个数限制 +466 01610 指定由命名的存储过程返回的查询结果集的个数。成功完成 +494 01614 由存储过程返回的结果集的个数超过了由ASSOCIATE LOCATORS语句指定的结果集定位器的个数 +495 01616 因为倒台SQL的成本估算超出了在ELST中指定的警告阀值，所以发出警告 +535 01591 请求一个主健的定位更新，或请求一个使用自我引出 约束的表的删除操作 +541 01543 命名外健是一个重复的引用约束 +551 01548 命名的授权ID缺少在命名的DB2对象上执行命名操作的权限 +552 01542 命名的授权ID缺少执行命名操作的权限 +558 01516 已经被授权该PUBLIC，因此WITH GRANT OPTION不可用 +561 01523 对ALTER REFERENCES INDEX 和TRIGGER特权，PUBLIC AT ALL LOCATION无效 +562 01560 因为GRANTEE已经拥有这些特权，所以一个或更多的特权被忽略 +585 01625 模式名指定了不止一次 +599 01596 没有为长字符数据类型（BLOB，CLOB和DBCLOB）建立比较函数 +610 01566 由于建立了一个指定为DEFER YES的索引，指定的对象处于PENDING状态，或者因为使用了ALTER INDEX改变关键值的范围，所以指定的对象处于PENDING状态 +625 01518 因为删除了主健索引，所以表定义被标注为不完整 +626 01529 删除了加强UNIQUE约束的索引，唯一性不在被加强 +645 01528 因为建立的索引中没有包含NULL，所以WHERE NOT NULL被忽略 +650 01538 不能更改或者建立已命名的表为从属表 +653 01551 在已指定的分区表空间中尚没有建立指定的分区索引，所以分区索引不可得 +655 01597 为CREATE或ALTER STOGROUP语句指定特定或者非特定的卷ID，在DB2较新发布的版本中（版本6以后）将不再支持他们 +658 01600 当建立目录索引时，不能指定SUBPAGES语句，SUBPAGES将被忽略，并缺省为1 +664 01540 分区索引的限制关键字超出了最大值 +738 01530 已命名的对象的更改可能像只读系统中对象的改变要求一样 +799 0157 SET语句中引用的特定寄存器不存在，将忽略 SET请求 +802 01519 数据溢出或者因除法异常而引起的数据异常错误 +806 01553 ISOLATION（RR）与LOCKSIZE PAGE 冲突 +807 01554 由于十进制乘法导致溢出 +863 01539 连接成功，但是只支持SBCS +2000 56094 SUBPAGES不等于1的1型索引不能成为数据共享环境中的缓冲池组依赖者 +2002 01624 因为指定的缓冲池不允许超高速缓存，GNPCACHE指定被忽略 +2007 01602 因为DB2子系统的参数禁用“提示(hiats）”所以不能指定优化提示 +30100 01558 分布式协议错误被检测到，提供原来的SQLCODE和SQLSTATE -007 42601 SQL语句中由非法字符 -010 42603 字符串常量非正常终止；检查到有遗漏的引号标志 -029 42601 需要INTO语句 -060 42815 某特定数据类型的长度或者标量规范无效 -084 42612 不能执行SQL语句，因为该语句对动态SQL无效或者对OS/390的DB2无效 -097 42601 在单位类型、用户自定义的函数以及过程中不能使用带有CAST的LONG VARCHAR或LONGVARGRAPHIC -101 54001 SQL语句超出了已确定的DB2限制：例如，表的数目太多，语句中的字节太多 -102 54002 字符串常量太长 -103 42604 无效数学文字 -104 42601 SQL语句中遇到非法符号 -105 42604 无效的字符串格式；通常引用一个格式不正确的图形字符串 -107 42622 对象名太长 -108 42601 RENAME语句中指定的名字有错误，不能使用限定词 -109 42601 指定了无效语句；例如CREATE VIEW不能包含ORDER BY 语句 -110 42606 遇到了无效的十六进制的文字 -111 42901 指定的列函数没有给出列名 -112 42607 无效的列函数语法；列函数不能运行与其他的列函数之上 -113 42602 遇到无效字符 -114 42961 该语句的位置名称必须与当前服务器匹配，但是却没有匹配 -115 42601 因为比较运算符没有伴着一个表达式或者列表，遇到了无效谓词 -117 42802 待插入的数值的个数于被插入的行中的列数不相等 -118 42902 数据修改语句(UPDATE或DELETE）和FROM语句中的表和视图命名不合法 -119 42803 HAVING语句中的列的列表与GROUP BY语句中的列列表不匹配 -120 42903 不允许WHERE语句、SET语句、VALUES语句或者SET ASSIGNMENT语句引用列函数 -121 42701 在INSERT或UPDATE语句中，某一列被非法引用了两次 -122 42803 非法使用了列函数。因为没有用于一个列函数的所有列不再GROUP BY语句中 -123 42601 特定位置的参数必须是一个常数或者一个关键词 -125 42805 ORDER BY语句中指定了无效数字，该数字要么小于1要么大于选定的列数 -126 42829 不能为一个UPDATE语句指定ORDER BY语句 -127 42905 在子选择中DISTINCT只能指定一次 -128 42601 SQL谓词中NULL使用不当 -129 54004 SQL语句中包含的表多于15个 -130 22019 ESCAPE语句必须为一个字符 -131 42818 LIKE谓词只能用于字符数据 -132 42824 LIKE语句、ESCAPE语句、LOCATE函数或POSSTR函数中有无效运算对象 -133 42906 无效相关子查询引用 -134 42907 大于255字节的列被不正确使用 -136 54005 排序关键字的长度大于4000字节 -137 54006 被连接的字符串太大；字符的最大值为32767；图形的最大值为16382 -138 22011 SUBSTR列函数的第二个或第三个操作符无效 -142 42612 不支持的SQL语句。该语句可能在另外的RDBMS上有效，也有可能在其他的上下文中有效（例如，VALUES只能在触发器中出现） -144 58003 指定的段号无效 -147 42809 某一源函数不能更改。要改变源函数，必须删除该源函数并重新建立他 -148 42809 RENAME和ALTER无法执行。RENAME不能对视图或者活动RI.ST表重新命名。ALTER不能用于改变列的长度，因为该列参与了RI、一个用户退出程序、全局的临时表或打开DATACAPTURE CHANGES表的列 -150 42807 触发活动的INSERT，UPDATE或DELETE语句中指定了无效的视图更新或一个无效的转换表 -151 42808 试图更新一个不可更新的视图的列、一个DB2 CATALOG表的列或者一个ROWID列 -152 42809 DROP CHECK试图删除一个参照约束，或者DROP FOREIGN试图删除一个检查约束 -153 42908 无效的视图建立请求，必须为旋转列表中列出的列出的未命名的列或者重复的列提供一个名字 -154 42909 不能用UNION、UNION ALL或者一个远程表建立视图 -156 42809 在视图上建立索引是非法的，或者在ALTER TABLE，CREATE TRIGGER，DROP TABLE或LOCK TABLE语句上指定一个不是表的其他对象这是无效的 -157 42810 必须在FOREIGN KEY语句中指定一个表名 -158 42811 视图的列和选择列表中的列不相匹配 -159 42089 无效DROP或COMMENT ON语句 -160 42813 对该视图的WITH CHECK OPTION无效 -161 44000 正被更新的视图WITH CHECK OPTION语句使得这行不能被插入或更新 -164 42502 用户没有建立这个视图的权限 -170 42605 标量函数指定了无效的参数个数 -171 42815 标量函数指定了无效的数据类型长度或者无效数值 -173 42801 在非只读型的游标上不能指定隔离级别UR -180 22007 DATE、TIME、TIMESTAMP值的字符串表示法的语法不对 -181 22001 不是有效的DATE、TIME、TIMESTAMP值 -182 42816 在算术表达式中的日期/时间值无效 -183 22008 在算术表达式中返回的日期/时间值的结果不在有效值的范围内 -184 42610 没有正确使用日期/时间值的参数标记 -185 57008 没有定义本定的日期/时间出口 -186 22505 改变本定的日期/时间出口引发这个程序的长度无效 -187 22506 MVS返回无效的当前日期/时间 -188 22503 字符串表示无效 -189 22522 指定的编码字符集的ID无效或没有定义 -190 42837 不能象所设定的那样改变（ALTER）列。只能改变（ALTER）VARCHAR列的长度 -191 22504 字符串中包含了无效的混合数据 -197 42877 当两个或多个表被联合在一起排序时，限定的列名不能在ORDER BY语句中使用 -198 42617 试图对空的字符串发布一个PREPARE或EXECUTE IMMEDIATE语句 -199 42601 SQL语句中使用了非法关键词 -203 42702 模糊列引用 -204 42704 没有定义的对象名 -205 42703 指定的表的列名无效 -206 42703 列名没有在FROM语句所引用的任何表中，或者没有在定义触发器所在的表中 -208 42707 不能ORDER BY指定列，应为该列不在选择列表中 -212 42712 指定的表名在触发器中不允许多次使用，只能使用一次 -214 42822 DISTINCT、ORDER BY 引起的无效表达式 -219 42704 因为PLAN_TABLE不存在，EXPLAIN无法执行 -220 55002 遇到无效的PLAN_TABLE列 -221 55002 如果为PLAN_TABLE定义了可供选择的列，那么，必须定义所有的列 -229 42708 指定的现场找不到 -240 428B4 LOCK TABLE语句的PART子句无效 -250 42718 没有定义本地位置名 -251 42602 记号无效 -300 22024 宿主变量或参数中的字符串不是以NULL为终止 -301 42895 无效的宿主变量数据类型 -302 22001 输入的变量值对指定的列无效 -303 42806 因为数据类型不兼容，不能分配数值 -304 22003 因为数据超出了范围，不能分配数值 -305 22002 没有NULL指示符变量 -309 22512 因为引用的宿主变量被设置成NULL，所以谓词无效 -310 22501 十进制的宿主变量或参数包含非十进制数据 -311 22501 输入的宿主变量长度无效，或者时负值或者太大 -312 42618 没有定义宿主变量或者宿主变量不可用 -313 07001 宿主变量的个数不等于参数标识的个数 -314 42714 模糊的宿主变量引用 -327 22525 在最后分区的关键字范围内，不能插入行 -330 22021 不能成功的翻译字符串 -331 22021 字符串不能分配到宿主变量，因为其不能成功的被翻译 -332 57017 不能为两个命名的编码字符集的ID定义翻译规则 -333 56010 子类型无效导致翻译失败 -338 42972 ON语句无效，必须引用连接的列 -339 56082 访问DB2 2.2版本的子系统被拒绝，原因时ASCII到EBCDIC翻译不能进行 -350 42962 无效的大对象规范 -351 56084 SELECT列表中有不支持的数据类型 -352 56084 输入列表中有不支持的数据类型 -355 42993 LOB列太大，以至不能被记录在日志中 -372 428C1 每个表只允许有一个ROWID列 -390 42887 在上下文中指定的函数无效 -392 42855 自从前一次FETCH以来，指定游标的SQLDA已被不恰当的改变 -396 38505 在最后的访问过程中，视图执行SQL语句 -397 428D3 在某一列上不恰当的指定了GENERATED因为该列不是ROWID数据类型 -398 428D2 为某一个宿主变量请求LOCATOR，但是该宿主变量不是一个LOB -399 22511 在INSERT语句中为ROWID列指定的值无效 -400 54027 在DB2编目中定义的用户自定义索引不能超过100个 -401 42818 算术操作符或比较操作符的操作对象不是兼容的 -402 42819 算术函数不能用于字符或日期时间数据 -404 22001 SQL语句指定的字符串太长 -405 42820 数值文字超出了范围 -406 22003 计算出的或者倒出的数值超出了范围 -407 23502 不能把NULL值插到定义为NOT NULL的列中 -408 42821 数值不能被更新或插入，因为他与列的数据类型不兼容 -409 42607 COUNT函数指定的运算对象无效 -410 42820 浮点文字笔30个字符的最大允许长度长 -411 56040 CURRENT SQLID使用无效 -412 42823 在子查询的选择列表中遇到了多个列 -413 22003 当转换为一个数字型数据类型时，数据溢出 -414 42824 LIKE谓词不能运行于用数字或日期时间类型定义的列 -415 42825 为UNION操作指定的选择列表不是联合兼容的 -416 42907 包含UNION操作符的SQL语句不允许有长的字符串列 -417 42609 两参数标识符作为运算对象被指定在同一谓词的两边 -418 42610 参数标识符使用无效 -419 42911 十进制除法无效 -420 22018 字符串自变量值不符合函数的要求 -421 42826 UNION操作的选择列表中没有提供相同数目的列 -423 0F001 为LOB或结果集定位器指定的值无效 -426 2D528 在不允许更新的应用服务器不允许执行COMMIT语句 -427 2D529 在不允许更新的应用服务器不允许执行ROLLBACK语句 -430 38503 在用户自定义的函数或存储过程中遇到了错误 -433 22001 指定的值太长 -435 428B3 无效的应用定义的SQLSTATE -438 xxxxx 使用了RAISE_ERROR函数的应用发出了一个错误 -440 42884 存储过程或用户自定义函数的参数列表参数个数于预期的个数不匹配 -441 42601 与标量函数一起使用DISTINCT或ALL是不正确的用法 -443 42601 指定的外部函数返回错误的SQLSTATE -444 42724 与被称为存储过程或用户自定义函数有关的程序不能找到 -449 42878 对存储过程或用户自定义的 函数，CREATE或ALTER语句不正确（缺失EXTERNAL NAME 子句) -450 39501 存储过程或用户自定义函数写入存储器的值超过了参数声明的长度 -451 42815 CREATE FUNCTION中指定了不正确的数据类型 -453 42880 用户自定义函数中的RETURNS语句无效 -454 42723 指定的函数识别标记与已存在的另一函数的识别标记冲突 -455 42882 模式名不比配 -456 42710 为用户自定义函数指定的函数名已经存在 -457 42939 用户自定义函数或用户自定义类型正试图使用系统中定义的函数或者类型所用的名称 -458 42883 没有找到函数 -463 39001 特定的外部例程返回无效的SQLSTATE -469 42886 参数定义为OUT或INOUT的CALL语句必须提供宿主变量 -470 39002 指定了NULL参数，但是该例程却不支持NULL -471 55023 存储过程或用户自定义函数失败：提供原因代码 -472 24517 外部的函数程序使游标处于打开状态 -473 42918 用户自定义数据类型命名不能和系统定义的数据类型一样 -475 42866 结果类型不能被转换成RETURNS类型 -476 42725 在其模式中该函数不是独一无二的 -478 42893 不能DROP或REVOKE特定的对象，因为其他对象依赖于该对象 -480 51030 直到存储过程已经被CALL后，DESCRIBE PROCEDURE和ASSOCIATE LOCATORS才能被发布 -482 51030 存储过程不返回到任何一个定位器 -483 42885 CREATE FUNCTION语句中的参数个数与源函数中的参数个数不匹配 -487 38001 选择了NO SQL选项建立指定的存储过程或用户自定义函数，但却视图发布SQL语句 -491 42601 CREATE FUNCTION语句无效，因为该语句没有RETURNS语句或者因为该语句没有指定有效的SOURCE或者EXTERNAL语句 -492 42879 指定函数的指定参数的个数有错误 -495 57051 语句的估计处理器成本超出了资源限制 -496 51033 语句无法执行，因为当前服务器与调用存储过程的服务器不同 -497 54041 指定的数据库超过了32767 OBID的上限，或者CREATE DATABASE语句使之达到了32511DBID的上限 -499 24516 指定的游标已被分配到结果集，该结果集来自已经指定的存储过程 -500 24501 因为连接被破坏，WITH HOLD游标被关闭 -501 24501 在试图获取数据或关闭一个游标前必须打开一个游标 -502 24502 在没有关闭游标前不能再次打开游标 -503 42912 因为列在游标的FOR UPDATE OF语句中没有被指定，该游标用于获取该列，所以不能更新该列 -504 34000 不能引用一个游标，因为他不是定义到程序里的 -507 24501 在试图更新或者删除WHERE CURRENT OF前，必须打开游标 -508 24504 因为被引用的游标当前不是处于数据行上，所以不能被更新或删除 -509 42827 除了在游标上指定的那个表（该表由WHERE CURRENT OF语句引用的）以外，再也不能从别的表上更新数据 -510 42828 表或视图不能被修改 -511 42829 对不可修改的表或视图，FOR UPDATE OF语句无效 -512 56023 对远程对象的无效引用 -513 42924 一个别名不能再被定义成另外的别名 -514 26501 游标尚没有被准备 -516 26501 试图描述未准备好的SQL语句 -517 07005 因为SQL语句尚没有准备好，游标无效 -518 07003 试图执行尚没有准备好的SQL语句 -519 24506 当为游标的SQL语句发布一个准备语句是，游标不能是打开的 -525 51015 不能在已指定的程序包中执行SQL语句，因为在绑定时间内该程序包无效 -526 42995 在给定的上下文中，不能使用全局的临时表 -530 23503 对特定的约束名指定了无效的外健值 -531 23504 从版本5开始，父关键字的多行更新将试图删除一个外关键字依赖的父关键字值，在版本5以前，当引用主关键值外健值当前存在时，试图更新该主健值 -532 23504 删除操作违反了已指定的参照约束 -533 21501 多行插入无效，试图将多行插到自我引用的表中 -534 21502 可改变主健列值的更新语句不能在同一时刻用于更新多行 -535 21502 当从自我引用表中删除数据或者更新主健列时，不能指定WHERE CURRENT OF。不是版本5的子系统才调用该代码 -536 42914 因为某一特定表的参照约束存在，所以删除语句无效 -537 42709 在外健语句或主健语句的规范中，每个列的出现不能多于一次 -538 42830 无效的外健；不符合引用的表没有主健 -539 42888 不能定义外健，因为被引用的表没有主健 -540 57001 表定义不完整，直到为主健建立了唯一索引或UNIQUE语句、或者包含GENERATED BYDEFAULT属性的ROWID列 -542 42831 可以为空的列不允许作为主健的一部分包含在内 -543 23511 因为该表是指定了SET NULL删除规则的参照约束的父表而且检查约束不允许NULL，所以DELETE不能发生 -544 23512 不能用ALTER添加检查约束，因为已存在的某行与该检查约束冲突 -545 23513 INSERT或者UPDATE导致检查约束冲突 -546 42621 在CREATE或ALTER TABLE中指定的检查约束无效 -548 42621 因为指定的列而引起的检查约束无效 -549 42509 DYNAMICRULES（BIND）计划或程序包的无效SQL语句 -551 42501 用户试图对不拥有权限的特定的对象进行操作，或者表不存在 -552 42502 用户试图执行未被授权的操作 -553 42503 不能指定CURRENT SQLID，因为用户尚没有被允许改变那个ID -554 42502 不能对你本身赋予一个权限 -555 42502 不能对你本身撤销一个权限 -556 42504 不能撤销用户没有拥有的权限 -557 42852 指定了不一致的授予或撤销关键词 -558 56025 为授予或撤销语句指定了无效的语句（一个或一组） -559 57002 DB2权限机制已经禁用，授予或者撤销不能被发布 -567 42501 指定的权限ID缺少对指定的程序包的绑定权限 -571 25000 不允许多点更新 -573 42890 不能定义参照约束，因为已指定的父表中在指定的列上没有唯一健 -574 42864 指定的缺省与列定义冲突 -577 38002 试图修改用户自定义函数中的数据或者存储过程中的数据，但这些对象的建立没有选择MODIFIES SQL DATA选项 -579 38004 试图修改用户自定义函数中的数据或者存储过程中的数据，但这些对象的建立没有选择READ SQL DATA选项，也没有选择MODIFIES SQL DATA选项 -580 42625 CASE表达式中的结果表达式不能都是空的 -581 42804 CASE表达式中的结果表达式为不兼容的数据类型 -582 42625 SEARCHED－WHEN－CLAUSE中的查找条件指定了一个限定的、IN或EXISTS谓词 -583 42845 指定的函数失败，因为他不是决定性的，或者可能有外部动作 -585 42732 在当前路径中模式名不止一次出现 -586 42907 CURRENT PATH专用寄存器在长度上不能超过254字符 -587 428C6 项目引用的列表必须是同一个家族 -590 42734 在命名的存储过程或用户自定义的函数中的参数必须是独一无二的 -592 42510 没有授权权限，让你在WLM环境中建立的存储过程或者用户自定义函数 -601 42710 试图创建（或重命名）已经存在的对象 -602 54008 CREATE INDEX语句中指定的列太多 -603 23515 因为发现有重复值，所以不能建立唯一的索引 -604 42611 在CREATE或ALTER TABLE语句中的为数据类型指定的长度、精度以及标度无效 -607 42832 指定的INSERT、UPDATE或DELETE语句不能被发布，应为这些语句对DB2 CATLOG表执行写操作 -611 53088 当LOCKSIZE是TABLE或者TABLESPACE时，LOCKMAX必须为0 -612 42711 在同一个表、索引或试图中不允许有重复列名 -613 54008 主健或UNIQUE约束太长或者包含了太多的列 -614 54008 已经超过了索引的内部健长度的最大长度（255）限制 -615 55006 不能删除这个程序包，因为该程序包目前正在执行 -616 42893 指定的对象不能被删除，因为其他对象依赖于该对象 -617 56089 对于DB2版本6，1型索引无效。对于以前的版本，1型索引不能用LOCKSIZE ROW或LARGE表空间定义 -618 42832 对DB2 CATALOG表的请求操作时不允许的 -619 55011 DSNDB07不能修改，除非他先被停止了 -620 53001 对在DSNDB07中的表空间不允许指定该关键词 -621 58001 遇到了重复的DBID，遇到了系统问题 -622 56031 不能指定FOR MIXED DATA因为没有安装混合数据选项 -623 55012 不能为单一的表定义多个族索引 -624 42889 不能为单一的表定义多个主健 -625 55014 用主健定义的表要求唯一索引 -626 55015 不能发布ALTER语句来改变PRIQTY SECQTY或ERASE，除非先停止了表空间 -627 55016 不能发布ALTER语句来改变PRIQTY SECQTY或ERASE，除非先把表空间定义为使用存储器组的表空间 -628 42613 指定语句时相互排斥的（例如，不能分区一个分段的表空间） -629 42834 因为该外健不能包含空值，所以SET NULL无效 -630 56089 不能为1型索引指定WHERE NOT NULL -631 54008 无效的外健；要么是比254个字节长，要么包含的列数多于40 -632 42915 指定的删除规则禁止把这个表定义为已制定表的从属表 -633 42915 无效删除规则；必须使用特定的强制删除规则 -634 42915 在这种情况下，DELETE CASCADE不允许 -635 42915 删除规则不能有差异或者不能为SET NULL -636 56016 在分区索引健的升序或降序规范中，分区所以必须与该规范一致 -637 42614 遇到重复的关键词 -638 42601 在CREATE TABLE语句中缺少列定义 -639 56027 带有SET NULL的删除规则的外健的可空列不能是分区索引的列 -640 56089 不能为这个表空间指定LOCKSIZE ROW，因为在该表空间中的表上定义了1型索引 -642 54021 唯一约束包含太多的列 -643 54024 检查约束超出了3800个字符的最大长度 -644 42615 在SQL语句中为关键词指定的值无效 -646 55017 在指定的分区表空间或者缺省表空间中不能创建表，因为指定的表空间已经包含了一个表 -647 57003 指定的缓冲池无效，因为他没有被激活 -650 56090 ALTER INDEX不能被执行；提供了原因代码 -651 54025 如果CREARE或ALTER TABLE被允许，表对象的描述词（object descriptor,OBD）将超过最大值（32KB） -652 23506 遇到了EDITRPROC或VALIDPROC冲突 -653 57004 在分区表空间中的表不可用，因为分区索引尚未被创建 -655 56036 在卷的列表中，STOGROUP不能指定为特定的或不特定（“*”）的卷 -658 42917 当试图删除指定的对象时，无法删除该对象，该对象的删除必须通过删除与之相关联的对象完成 -660 53035 不正确的分区索引规范，必须为族索引定义有限制的关键字 -661 53036 分区索引没有指定恰当的分区数目 -662 53037 试图在未分区的表空间（分段的或简单的）上建立分区索引 -663 53038 为分区索引指定的关键字限制值是一个无效数字 -665 53039 为ALTER TABLESOACE语句指定了无效的PART语句 -666 57005 SQL语句不能被处理，因为指定的函数当前正处于进行过程中 -667 42917 不能明确的删除分区表空间的族索引，必须除去分区表空间来去掉分区索引 -668 56018 不能向用EDITPROC定义的表中添加列 -669 42917 不能显式的删除分区表空间中的表，必须删除分区表空间来删除表 -670 54010 表的记录长度超过了页面的大小 -671 53040 不能更改指定的表空间的缓冲池，因为这将改变表空间的页面大小 -672 55035 在命名的表上不允许DROP -676 53041 只有4KB的缓冲池可被用于一个索引 -677 57011 缓冲池扩展失败，由于可用的虚拟内存的大小不足 -678 53045 为才分区索引中指定的限制健提供的值与数据类型不符 -679 57006 不能创建某一个特定对象，因为该对象的一个drop目前正在挂起 -680 54011 对DB2表不能超过750列 -681 23507 列违反了指定的FIELDPROC -682 57010 不能载入FIELDPROC -683 42842 列、单值类型、函数或者过程无效，因为不兼容语句。例如，指定的INTEGER具有FORBITDATA选项 -684 54012 指定的文字列表不能超过254个字节 -685 58002 FIELDPROC返回一个无效的域描述 -686 53043 用FIELDPROC定义的一个列不能与一个使用不同的FIELDPROC定义的列作比较 -687 53044 列不能与一个非兼容字段类型的列比较 -688 58002 返回不正确的数据 -689 54011 从属表定义了太多的列 -690 23508 数据定义的控制支持拒绝这个语句 -691 57018 命名的注册表不存在 -692 57018 命名的索引不存在，但命名的注册表需要该索引 -693 55003 命名的注册表/索引的命名列无效 -694 57023 DROP正在命名的注册表上挂起 -696 42898 由于相关的名字或者转换表的名字使用不正确，指定的触发器无效 -697 42899 FOR EACH语句被指定，因此与OLD合NEW相关的名字是不允许的，或者不能为一个BEFORE触发器指定OLD_TABLE和NEW_TABLE -713 42815 指定的专用寄存器是无效的 -715 56064 命名的程序不能被运行，因为他依赖与你所安装的DB2版本的部件，但是你的数据中心没有安装这个部件 -716 56065 命名的程序使用这个版本的不正确的发行版本做了预编译 -717 56066 BIND失败，因为他依赖与你所安装的DB2版本的部件，但是你的数据中心没有安装这个部件 -718 56067 REBIND失败，因为IBMREQD列无效 -719 42710 不能BIND ADD一个已经存在的程序包 -720 42710 不能BIND REPLACE一个已经存在的程序包版本 -721 42710 程序包的一致性记号必须是独一无二的 -722 42704 绑定错误，因为指定的程序包不存在 -723 09000 一个触发的SQL语句接受到一个错误 -724 54038 达到了（16）级联间接的SQL语句的最大项目 -725 42721 对专门指定的寄存器提供了一个无效值 -726 55030 因为SYSPKSYSTEM条目，不能绑定这个程序包 -728 56080 指定的数据类型不能与私有协议发布一起使用 -729 429B1 用COMMIT ON RETURN定义的存储过程不能用作嵌套的CALL过程的目标 -730 56053 在只读的共享数据库中为表定义的参照完整性无效 -731 56054 VSAM数据集必须用SHAREOPTION（1.3）定义 -732 56055 被定义为只读型数据库却拥有没有定义空间或者索引空间的DB2子系统 -733 56056 只读共享数据库的定义不一致 -734 56057 一旦一个数据库被定义为ROSHARE READ，他将不能被更改为其他不同的ROSHARE状态 -735 55004 用DBID名称标识的数据库不再是一个只读共享数据库 -736 53014 命名的DBID无效 -737 53056 在这种状况下，不能建立一个隐含的表空间 -739 56088 因为同时指定了ALLOW PARALLEL和MODIELES SQL DATA这两个语句，因此已设定的函数将不能再被更改 -740 51034 在这种方式下不能用MODIELES SQL DATA定义指定的函数 -741 55030 已经为命名的共享组成员的数据定义了工作文件数据库 -742 53004 DSNDB07是隐含的工作文件数据库 -746 57053 在特定的触发器、存储过程或函数中的SQL语句违反嵌套SQL限制 -747 57054 指定的表是不可用的除非为LOB数据列建立起必须的辅助表 -748 54042 在指定的辅助表上已经有一个索引 -750 42986 不能对已指定的表重新命名,因为他至少在一个现存的视图或触发器中被引用 -751 42987 存储过程或用户自定义的函数试图执行一个不允许执行的SQL语句。DB2的线程被置于MUST_ROLLBACK状态 -752 0A001 无效CONNECT语句 -763 560A1 无效的表空间名 -764 560A2 LOB表空间必须与其相关的基表空间同在一个数据库中 -765 560A3 表和数据库不兼容 -766 560A4 不能对辅助表进行请求的操作 -767 42626 CREATE INDEX失败，因为在辅助表中为索引指定了列，或者因为没有为非辅助表的索引指定列 -768 560A50 不能为指定的列或者指定的分区建立辅助表，因为其辅助表已经存在 -769 53096 CREATE AUX TABLE的规格与基表不匹配 -770 530A6 指定的表必须有一个ROWID列，那么该表才可以包含一个LOB列 -771 428C7 无效的ROWID列规范 -797 42987 CREATE TRIGGER包含不被支持的语法 -798 428C9 不能把一个值插入到用GENERATED ALWAYS定义的ROWID列 -802 22012 某一特定操作发生了异常错误。被零除 -803 23505 不能插入行，因为这将违反唯一索引的约束 -804 07002 SQLDA的调用参数列表有误 -805 51002 在计划中没有发现DBRM或程序包名 -807 23509 对已指定的环境和连接，该程序包不可用 -808 08001 CONECT语句与程序中的第一个CONNECT语句不一致 -811 21000 当多行作为一内嵌的选择语句的返回结果是，必须使用游标 -812 22508 在CURRENT PACKAGESET中的ID集合是空白的，语句不能被执行 -815 42920 在一个内置选择语句或者一个基本谓词的子查询中，显式的或隐含的指定了GROUP BY或HAVING语句 -817 25000 执行SQL语句将可能导致禁止更新用户数据或DB2编目 -818 5103 计划载入组件的时间戳不匹配，在执行计划中没有从同一个预编译中建立DBRM，该预编译是作为组件载入的 -819 58004 视图不能重建，因为在DB2编目中存储的分析树长度为0 -820 58004 在这个DB2版本的DB2编目中遇到了无效值 -822 51004 在SQLDA中遇到了无效地址 -840 54004 在选择列表或插入列表中返回的项目太多 -842 08002 到指定位置的连接已经存在 -843 08003 SET CONNECTION或RELEASE语句无法执行，因为连接不存在 -870 58026 宿主变量描述符的个数不等于语句中宿主变量的个数 -872 51302 这个子系统已指定了有效的CCSID -873 53090 同一SQL语句中，不能同时引用EBCDIC表中的定义的列和ASCII表中定义的列 -874 53901 指定对象的编码方案与其表空间的编码方案不匹配 -875 42988 指定的操作符不能用于ASCII数据 -876 53092 不能为指定的原因创建对象：提供了原因代码 -877 53093 数据库或表空间不允许用ASCII，必须使用EBCDIC -878 53094 该PLAN——TABLE不能是ASCII，必须使用EBCDIC -879 53095 指定对象的CREATE或ALTER语句不能将列、单值类型，某个存储过程或用户自定义函数的参数定义为以下类型：MAXED DATA，GRAPHIC，VARGRAPHIC，LONGVARGRAPHIC，因为系统没有为指定的编码方案定义相应的CCSID -900 08003 应用处理没有连接到应用服务器，语句不能被执行 -901 58004 遇到时断时续的系统错误，该错误不能抑制后继的SQL语句的执行 -902 58005 内部控制块的指针错误，要求重新绑定 -904 57011 指定的资源不可用 -905 57014 超出了资源上限 -906 51005 因为重大错误，SQL语句无法执行 -908 23510 当前资源限制设施的规范或者自动重绑定的系统参数不允许BIND，REBIND，AUTOREBIND -909 57007 对象已被删除 -910 57007 因为在该对象上挂起DROP，所以不能访问该对象 -911 40001 当前工作单元已被回滚 -913 57033 因为死锁或超时导致不成功执行 -917 42969 绑定程序包已经失败 -918 51021 SQL语句不能被执行，因为连接丢失 -919 56045 需要一个ROLLBACK -922 42505 连接权限失败。试图从TSO、CICS或IMS访问DB2，同时相应的连接设施处于非活动的状态 -923 57015 因为DB2不可用，所以不能建立连接 -924 58006 遇到了DB2内部的连接错误：提供了原因代码 -925 2D521 SQL的COMMIT语句不能从CICS或IMS/TM发布 -926 2D521 SQL的ROLLBACK语句不能从CICS或IMS/TM发布 -927 51006 当正在连接的环境没有建立时，语言接口被调用。利用DSN命令激发该程序 -929 58002 数据获取退出已经失败（DPROP） -939 51021 由于远程服务器的未请求的回滚，要求一个回滚 -947 56038 SQL语句失败，因为更新不能被传播（DPROP） -948 56062 DDF没有启动，分布式操作无效 -950 42705 在SQL语句中指定的位置在SYSIBM.LOCATIONS中没有定义 -954 57011 APP Heap区不足，用"DB2 UPDATE DB CFG FOR DBNAME USING APPLHEAPSZ 1024"可以解决(视情况修改大小)。注意要重启DB2以便让更改生效 -965 51021 存储过程非正常终止（在DB2 6之前的版本） -981 57015 当前不是处于允许SQL的状态时，试图在RRSAF中执行SQL -991 57015 调用连接不能建立一个到DB2的隐含或开放连接 -2001 53089 为储存过程指定的宿主变量参数的个数不等于预期的参数个数 -20003 560A7 不能为GRECP中的表空间或索引指定GBPCACHE NONE -20004 560A8 对于WORKFILE对象。8KB或16Kb的缓冲池页面大小无效 -20005 54035 指定的对象类型超出了内部的ID极限 -20006 53097 当没有指定WLM环境时，LOB不能被指定为参数 -20070 53098 不能非LOB列建立一个辅助表 -20071 53099 必须指定WLM环境名 -20072 56052 指定的权限ID不拥有在触发器程序包上执行BIND所需的权限 -20073 42927 不能按照指定的要求更改命名的函数，因为在现存的视图定义中引用了该函数 -20074 42939 不能建立指定的对象，因为“SYS”是一个保留的前缀 -20100 56059 在被触发的SQL语句中有BIND错误，指定了错误的SQLCODE和SQLSTATE -20101 56059 由于指定的原因代码，该函数失败 -20102 42849 在CREATE或ALTER FUNCTION语句中不能使用指定的选项 -20104 42856 更改一个CCSID失败 -20106 42945 不能改变表空间或数据库的CCSID，因为现存的试图引用 -30000 58008 DRDA分布协议错误；处理可以继续 -30002 57057 使用DRDA的分布式客户把OPEN语句连接到PREPARE，但PREPARE接受到一个SQLCODE为＋495的警告 -30020 58009 DRDA分布协议错误；对话被解除 -30021 58010 DRDA分布协议错误；处理不能继续 -30030 58013 违反分布协议：COMMIT不成功，对话被解除（AS） -30040 57012 因为不能得到资源，执行失败，处理可以继续（AS） -30041 57013 因为不能得到资源，执行失败，处理不能成功的继续（AS） -30050 58011 执行不成功，在BIND过程中不能执行语句 -30051 58012 特定的BIND过程不是处于活动状态（远程BIND），从而导致失败 -30052 42932 程序准备的假设错误 -30053 42506 程序包的拥有者遭遇授权失败 -30060 08004 RBD遭遇授权失败 -30061 08004 指定了无效或者没有存在的RDB -30070 58014 目标子系统不支持这个命令 -30071 58015 目标子系统不支持这个对象 -30072 58016 目标子系统不支持这个参数 -30073 58017 目标子系统不支持这个参数值 -30074 58018 应答信息不被支持 -30080 08001 SNA通信错误 -30081 58019 TCP/IP通信错误 -30082 08001 由于安全冲突、通信失败：提供了原因代码 -30090 25000 指定的操作对远程执行失败 -30104 56095 在绑定选项与绑定值中有错误 -30105 56096 指定的绑定选项不兼容
前几天试了试JFinal框架，感觉用起来还是蛮方便的，作者似乎借鉴了一些Ruby的思想，并且集成了一些常用的功能类，比如分页，图片验证码等等。个人觉得，与其说这是一个java的开发框架，不如说它是一个简洁的建站解决方案。JFinal的分页类感觉还是很方便的，官方的示例很简单也很清楚，直接调Model的paginate方法，传入当前页码，每页显示数量等参数就行了。不过，这只是分页查询数据库得到的数据列表，除此以外，还得把分页的信息展示在前端页面上，这时候就得自己实现一些分页逻辑以及相应的前端了。所以，我就简单封装了一个分页类，把一些分页需要的页面元素计算封装进去，配合freemarker，实现了一个功能还算完全的分页扩展，其实也不能叫扩展，只是一种简单的实现方式，贴出来给大家参考参考。先贴个效果图：PageHandler 类：package com.eric.huahuajia.dto; import com.jfinal.plugin.activerecord.Page; public class PageHandler { // 当前页码 public int pageNumber; // 每页数量 public int pageSize; // 总页数 public int totalPage; // 总行数 public int totalRow; // 是否有下一页 public boolean hasNextPage; // 是否有前一页 public boolean hasPreviousPage; // 下一页页码 public int nextPageNumber; // 前一页页码 public int previousPageNumber; // 页面基础URL，用作翻页事件 public String basePathUrl; // 偏移量，当分页过多时只显示当前页前后偏移部分页码 public int offSetNum = 3; // 需要显示出来的页码范围 - 起始页码 public int startPageNum; // 需要显示出来的页码范围 - 结束页码 public int endPageNum; /** * 构造函数，初始化 * @param pageNumber * @param pageSize * @param totalPage * @param totalRow */ public PageHandler(int pageNumber,int pageSize,int totalPage,int totalRow) { this.pageNumber = pageNumber; this.pageSize = pageSize; this.totalPage = totalPage; this.totalRow = totalRow; this.calculatePage(); this.calculateShowPage(); } /** * 构造函数，根据JFinal内置Page初始化 * @param pageInfo */ public <T> PageHandler(Page<T> pageInfo){ this.pageNumber = pageInfo.getPageNumber(); this.pageSize = pageInfo.getPageSize(); this.totalPage = pageInfo.getTotalPage(); this.totalRow = pageInfo.getTotalRow(); this.calculatePage(); this.calculateShowPage(); } /** * 计算当前页是否有前后页，并得出前后页码 */ private void calculatePage() { if ((this.pageNumber - 1) > 0) { this.hasPreviousPage = true; this.previousPageNumber = this.pageNumber - 1; } else { this.hasPreviousPage = false; this.previousPageNumber = 0; } if (this.pageNumber >= this.totalPage) { this.hasNextPage = false; this.nextPageNumber = 0; } else { this.hasNextPage = true; this.nextPageNumber = this.pageNumber + 1; } } /** * 计算需要显示出来的页码范围 */ private void calculateShowPage(){ // 前偏移 int preCalulateNum = this.pageNumber - this.offSetNum; // 后偏移 int nextCalulateNum = this.pageNumber + this.offSetNum; if (preCalulateNum > 0){ this.startPageNum = preCalulateNum; }else{ this.startPageNum = 1; } if (nextCalulateNum > this.totalPage){ this.endPageNum = this.totalPage; }else{ this.endPageNum = nextCalulateNum; } } public int getPageNumber() { return pageNumber; } public void setPageNumber(int pageNumber) { this.pageNumber = pageNumber; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public int getTotalRow() { return totalRow; } public void setTotalRow(int totalRow) { this.totalRow = totalRow; } public boolean isHasNextPage() { return hasNextPage; } public void setHasNextPage(boolean hasNextPage) { this.hasNextPage = hasNextPage; } public boolean isHasPreviousPage() { return hasPreviousPage; } public void setHasPreviousPage(boolean hasPreviousPage) { this.hasPreviousPage = hasPreviousPage; } public int getNextPageNumber() { return nextPageNumber; } public void setNextPageNumber(int nextPageNumber) { this.nextPageNumber = nextPageNumber; } public int getPreviousPageNumber() { return previousPageNumber; } public void setPreviousPageNumber(int previousPageNumber) { this.previousPageNumber = previousPageNumber; } public String getBasePathUrl() { return basePathUrl; } public void setBasePathUrl(String basePathUrl) { this.basePathUrl = basePathUrl; } public int getOffSetNum() { return offSetNum; } public void setOffSetNum(int offSetNum) { this.offSetNum = offSetNum; } public int getStartPageNum() { return startPageNum; } public void setStartPageNum(int startPageNum) { this.startPageNum = startPageNum; } public int getEndPageNum() { return endPageNum; } public void setEndPageNum(int endPageNum) { this.endPageNum = endPageNum; } } 这个类就是定义了一些分页的元素，通过JFinal分页方法返回的值，简单计算封装了一下然后，与此配合的freemarker页面：<#if pageHandler??> 共 ${pageHandler.totalRow} 条；${pageHandler.totalPage} 页；当前第 ${pageHandler.pageNumber} 页 <#if pageHandler.hasPreviousPage> ← 上一页 <#else> ← 上一页 </#if> <#-- 起始展示页跟首页相比大于0 --> <#if (pageHandler.startPageNum - 1 > 0)> ... </#if> <#list (pageHandler.startPageNum)..(pageHandler.endPageNum) as pNum> <#if pNum == pageHandler.pageNumber> ${pNum} <#else> ${pNum} </#if> </#list> <#-- 尾页跟结束展示页相比大于0 --> <#if (pageHandler.totalPage - pageHandler.endPageNum > 0)> ... </#if> <#if pageHandler.hasNextPage> 下一页 → <#else> 下一页 → </#if> </#if> 使用也很简单：// 调JFinal原生分页方法，获取返回值 Page<WikiArticle> wikiListPage = wikiService.queryPagedWikiList(pageNumber, HuaConstants.ONEPAGE_SIZE_NUM); // 将原生分页类返回值做为参数传入封装的分页类，得到封装好的分页信息 PageHandler pageHandler = new PageHandler(wikiListPage); pageHandler.setBasePathUrl("/dashboard/wikiList/"); OK，很简单，但是个人觉得还是蛮实用的。