签到成功

知道了

CNDBA社区CNDBA社区

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

2025-03-11 21:25 249 0 原创 DM数据库
作者: shinelifes

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,如下图所示。
http://www.cndba.cn/shinelifes/article/131624

http://www.cndba.cn/shinelifes/article/131624

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

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

http://www.cndba.cn/shinelifes/article/131624

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

报错问题已定位是这条sql产生-1044的报错,详细应用程序代码如下所示。
http://www.cndba.cn/shinelifes/article/131624

http://www.cndba.cn/shinelifes/article/131624

4、DPC日志信息

开启dpc日志,看看应用程序运行过程中的详细信息。如下图红色部分所示。
http://www.cndba.cn/shinelifes/article/131624

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使用手册。

http://www.cndba.cn/shinelifes/article/131624
http://www.cndba.cn/shinelifes/article/131624
http://www.cndba.cn/shinelifes/article/131624

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
shinelifes

shinelifes

关注
  • 28
    原创
  • 0
    翻译
  • 0
    转载
  • 0
    评论
  • 访问:32351次
  • 积分:99
  • 等级:注册会员
  • 排名:第29名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ