注册
PROC程序报无效的字符串或缓冲区长度问题
专栏/写意人生/ 文章详情 /

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

写意人生 2025/03/11 55 1 0
摘要 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,如下图所示。
0101.jpg

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

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

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

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

4、DPC日志信息

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

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宏方法如下图所示。
0105.jpg
以上处理方法仅限于特定的数据库版本和PROC程序,实际处理方法请参考官方PROC使用手册。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服