我已经创建了一个触发器,在触发器内我追加了很多varchar并创建了一个新的varchar。如果我追加了太多的varchar,那么我会得到下面的Sql异常。(如果我追加了4或5 varchar,那么我不会得到这个错误)
我发现varchar的最大大小是基于表空间的页面大小的。我检查了我的页面大小,它是8 K字节。
但是我追加的内容不是8 K字节,请帮我解决这个错误。
触发器“ORDDBA.ORD_IR_IN”中触发的SQL语句出错。错误返回的信息包括SQLCODE“-433”、SQLSTATE“22001”和消息标记“ACTION|面积单位|BAL_变更_标志|取消日期|“.. SQL代码= -723,SQL状态=09000,驱动程序=3.66.46
declare columnNames varchar(5000);
SET columnNames='';
SET columnNames = 'value1' ;
SET columnNames = CONCAT(columnNames, '|') ;
SET columnNames = CONCAT(columnNames, 'value2') ;
SET columnNames = CONCAT(columnNames, '|') ;
SET columnNames = CONCAT(columnNames, 'value3') ;
SET columnNames = CONCAT(columnNames, '|') ;
SET columnNames = CONCAT(columnNames, 'value14') ;
SET columnNames = CONCAT(columnNames, '|') ;
SET columnNames = CONCAT(columnNames, 'value5') ;
SET columnNames = CONCAT(columnNames, '|') ;
SET columnNames = CONCAT(columnNames, 'value6') ;
SET columnNames = CONCAT(columnNames, '|') ;
SET columnNames = CONCAT(columnNames, 'value6') ;
SET columnNames = CONCAT(columnNames, '|') ;
SET columnNames = CONCAT(columnNames, 'value8') ;
SET columnNames = CONCAT(columnNames, '|') ;
SET columnNames = CONCAT(columnNames, 'value9') ;
SET columnNames = CONCAT(columnNames, '|') ;
SET columnNames = CONCAT(columnNames, 'value10') ;
SET columnNames = CONCAT(columnNames, '|') ;
SET columnNames = CONCAT(columnNames, 'value11') ;
SET columnNames = CONCAT(columnNames, '|') ;
SET columnNames = CONCAT(columnNames, 'value12') ;
SET columnNames = CONCAT(columnNames, '|') ;
SET columnNames = CONCAT(columnNames, 'value13') ;
SET columnNames = CONCAT(columnNames, '|') ;
SET columnNames = CONCAT(columnNames, 'value14') ;
SET columnNames = CONCAT(columnNames, '|') ;
SET columnNames = CONCAT(columnNames, 'value15') ;
SET columnNames = CONCAT(columnNames, '|') ;
SET columnNames = CONCAT(columnNames, 'value16') ;
2条答案
按热度按时间nwo49xxi1#
根据您的评论:
如果我计算varchar中的字符数,它少于5000,DB2似乎以不同的方式计算,所以它失败了。
这是因为
varchar
的长度是以字节为单位给出的,而clob
的长度是以字符(documentation)为单位给出的。基于字符编码,单个字符可能比一个字节长。因此,在
varchar(5000)
中存储5000个字符并不总是可能的。sxpgvts32#
在Octets中定义的Varchar列与字符匹配。Codeunits32是我陷入这个陷阱的地方。