为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:8
【操作系统】:redhat7
【CPU】:
【问题描述】*:DPI执行了一个比较长的sql语句,绑定了33个参数,dpi_exec(sqlstatement)之后,返回码-70005,返回信息string Truncated。数据库后台日志显示收到了这个语句,但是没有执行。是不是sql命令缓冲区超过了?
数据库后台日志:
2022-02-26 12:25:53.511 (EP[0] sess:0x7f4fa8011438 thrd:19436 user:OPERATION trxid:1306769 stmt:0x7f4fa8034430 appname:tmdb ip:::ffff:10.2.70.73) [ORA]: UPDATE T_Instrument SET InstrumentID = ?, ExchangeID = ?, InstrumentName = ?, ExchangeInstID = ?, ProductID = ?, ProductClass = ?, DeliveryYear = ?, DeliveryMonth = ?, MaxMarketOrderVolume = ?, MinMarketOrderVolume = ?, MaxLimitOrderVolume = ?, MinLimitOrderVolume = ?, VolumeMultiple = ?, PriceTick = ?, CreateDate = ?, OpenDate = ?, ExpireDate = ?, StartDelivDate = ?, EndDelivDate = ?, InstLifePhase = ?, IsTrading = ?, PositionType = ?, PositionDateType = ?, LongMarginRatio = ?, ShortMarginRatio = ?, MaxMarginSideAlgorithm = ?, UnderlyingInstrID = ?, StrikePrice = ?, OptionsType = ?, UnderlyingMultiple = ?, CombinationType = ? WHERE InstrumentID=? AND ExchangeID=?^M
另外有没有办法看到,绑定变量以后的,完整的sql语句?
如果在达梦管理工具执行ok,那推测是您程序代码对数据绑定时出错的。
之前遇到过C++ , 单个字符 写成’A’ 绑定赋值,导致程序会把它转成65的ASCII数值,再进而转成数据库中’65’两位长的字符串,但数据库那边定义的char(1)
建议您仔细检查下源代码,或者贴出表结构和相应的代码
通过sp_set_para_value(1,‘SVR_LOG’,1);打开数据库的后台sql日志记录,再执行DPI程序,可以看到sql以及对应的绑定参数类型和值,你这个字符串截断的错误是存在绑定参数超过对应字段长度。