PROC程序报无效的字符串或缓冲区长度问题

  1. 基础环境信息

(1)数据库版本:

数据库版本:1-2-162-2023.03.28-185758-20018-ENT  --03134283938-20230328-185758-20018 Pack4

集群架构:两节点DMDSC

操作系统:Kylin Linux Advanced Server release V10 (SP3)

CPU:Hygon C86 7265

(2)PROC应用程序:

预编译命令工具:dpc_new.exe

PROC使用的达梦客户端版本:DM Database 64 V8 03134283938-20221019-172201-20018,如下图所示。

2、问题现象:PROC应用程序报错信息

应用程序在运行批业务时,执行pmdps104业务(结息),产生报错信息:无效的字符串或缓冲区长度,错误代码是SQLCODE-1044,如下图所示。

3、pmdps104-结息业务流程信息

报错问题已定位是这条sql产生-1044的报错,详细应用程序代码如下所示。

4、DPC日志信息

开启dpc日志,看看应用程序运行过程中的详细信息。如下图红色部分所示。

5、问题分析和处理

问题分析:

(1)将PROC原来使用的达梦客户端版本(8.1.2.162)换成8.1.3.162和8.1.4.73,还是报相同的错误信息。通过DPC日志信息分析发现,业务反映执行SQL语句报错的地方,在DPC日志中是正常的,字符串或缓冲区长度溢出并不是该SQL语句导致的。

(2)按照开发人员的建议,在所有PROC编译文件都加上了-DDM64宏,重新编译应用程序后。在客户端PROC8.1.4.73和PROC8.1.2.162测试,没有报错。业务人员把一个月的全部批量业务运行了测试,没有出现报错情况。

问题原因:

有些接口定义是slength类型,slength是根据宏控制的,只有这种宏情况可能导致溢出。如果在64位机器上编译,需要加上该选项。由于dpc_new在编译时需要使用DPItypes.h,而在DPItypes.h中定义了slength和 ulength类型。如果64位环境下编译应用时没加DM64宏,会导致DPI接口调用异常。

处理方法:

将所有PROC编译文件都加上了-DDM64宏,重新编译后进行测试。添加-DDM64宏方法如下图所示。

以上处理方法仅限于特定的数据库版本和PROC程序,实际处理方法请参考官方PROC使用手册。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值