当前位置: 首页 > news >正文

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

相关文章:

  • Java HashMap 底层原理
  • 【YOLO】AutoDL 训练模型
  • Python+DeepSeek:开启AI编程新次元——从自动化到智能创造的实战指南
  • Java三种注释方式
  • 【漫话机器学习系列】132.概率质量函数(Probability Mass Function, PMF)
  • 体验开源openeuler openharmony stratovirt模拟器
  • Linux内核实时机制18 - RT调度器1 - 数据结构
  • hive开窗函数
  • JavaScript性能优化实战
  • 第四十五篇-Tesla P40关闭GPU的ECC释放部分显存
  • 刷leetcode hot100--动态规划3.11
  • 指针的比较
  • MQTT 物联网的首先协议
  • 小程序 wxml 语法 —— 36 wxml 语法 - setData() 修改数据
  • 基于协同过滤算法的音乐推荐系统(源码+部署教程)
  • 【华三(H3C)交换机上修改 NTP 配置】
  • Docker安装Kafka(内含zookeeper)
  • 第二章:盒模型的奥秘
  • 每天一道算法题【蓝桥杯】【使用最小花费爬楼梯】
  • 扩散 Transformer 策略:用于通才视觉-语言-动作学习的规模化扩散 Transformer
  • 国家主席习近平同普京总统举行大范围会谈
  • 咖啡戏剧节举办第五年,上生新所“无店不咖啡,空间皆可戏”
  • 吴清:推动公募基金高质量发展的行动方案今天将会发布
  • 六大车企一季报:比亚迪近92亿净利稳居第一,多家车企营收下滑
  • 青岛鞋企双星名人集团家族内斗:创始人发公开信指控子孙夺权
  • 创历史同期新高!“五一”假期全国快递揽投超48亿件