1

我创建了一个触发器,在触发器内我添加了很多 varchar 并创建了一个新的 varchar。如果我附加了太多的 varchars,那么我将低于 Sql Exception。(如果我附加 4 或 5 个 varchar,那么我不会收到此错误)

我发现 varchar 最大大小基于表空间的页面大小。我检查了我的页面大小,它的 8K 字节。

但我附加的内容不是 8K 字节。请帮我解决这个错误。

触发器“ORDDBA.ORD_IR_IN”中的触发 SQL 语句发生错误。为错误返回的信息包括 SQLCODE“-433”、SQLSTATE“22001”和消息标记“ACTION|AREA_UNIT|BAL_CHG_FLAG|CANCEL_DATE|”.. SQLCODE=-723、SQLSTATE=09000、DRIVER=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') ;
4

2 回答 2

2

从您的评论中:

如果我计算 varchar 中的字符数小于 5000,似乎 DB2 以不同的方式计数,所以它失败了。然后我将数据类型更改为 CLOB,然后它工作正常

这是因为 a 的长度varchar以字节为单位,而 a 的长度clob以字符(文档)为单位。

根据字符编码,单个字符可能长于一个字节。因此,并非总是可以将 5000 个字符存储在varchar(5000).

于 2015-05-12T12:36:13.960 回答
0

在 Octets 中定义的 Varchar 列与字符匹配。Codeunits32 是我落入这个陷阱的地方。

于 2021-09-16T18:05:00.083 回答