【套打】错误ORA-00972:identifier is too long的解决方案原创
金蝶云社区-_Tmp
_Tmp
2人赞赏了该文章 5,882次浏览 未经作者许可,禁止转载编辑于2022年08月03日 15:25:40
summary-icon摘要由AI智能服务提供

本文讨论了Oracle数据库账套在套打时出现的报错问题,通过Apm监控定位到具体的SQL错误,并分析了错误原因与数据包结构。针对问题,提出了两个解决方案:一是设计单据时避免字段标识过长;二是通过插件修改查询接口的数据包以适应现有配置。文中还提供了修改字段属性名的示例代码,并解释了修改后的效果。

<0>案例:反馈如下图所示的套打报错

(这个问题只有Oracle数据库的账套有关系,非Oracle没有该问题可以不关注)

image.png

如果了解错误的代码,那么能够知道这个是Oracle数据库底层的抛出异常。


<1>问题分析:由于是数据库异常,那么最直接的就应该是查出异常的Sql,直接定位原因。这里我们利用Apm监控获取报错的sql,APM实时性能监控功能,快速跟踪性能问题

在当前页面打开监控页面,开启监控,然后重新套打,查看监控报告如下图所示(不同版本的界面显示可能不一致,但步骤都相同,找到套打请求取最后一个sql)

image.png


分析sql错误,首先错误标识一致,代表找对了(没找对则重新在监控中找sql,尝试停止再开启),如果你知道错误的原因或提示器能够提示原因(如果不了解建议结合搜索引擎),这里的错误是一个FSEQ结尾的字段。

image.png


分析数据包,字段的来源跟套打实现的原因:分析下堆栈,可以了解到套打是通过查询接口实现,数据包中的字段是以字段标识返回而非字段属性名返回;特别的,套打在单据体序号中则是以(单据体标识_序号字段标识)拼接,可以参考【套打高阶】套打干预数据包接口

image.png


这个问题目前平台无法调整,因为我们取数实现逻辑是固定的,而且针对

因此在这个问题上,建议以下两个方案。

<1>方案一,建议Oracle账套:在设计单据时,应尽可能避免字段标识长度小于等于30(查询服务规定,否则WebApi查询服务也会报错)、实体标识尤其是单据体长度+序号字段长度小于等于30(套打取序号字段需要,但不是必须条件)

<2>方案二,部分客户已在使用了一段时间,对应业务对象的单据数据插件等配置已经运行,针对这种情况,提供已干预套打查询接口调整数据包(并非所有字段都能以这个方案解决,使用该方案可能会导致套打中的数据包标识与字段无法匹配,导致部分逻辑实现,值为数据库查询结果而非字段相关逻辑结果)。

针对抓取SQL定位到目标实体,使用表单插件、列表插件修改查询修改对应字段的属性名(示例为小于30,C#、python代码见附件)

image.png

import clr
clr.AddReference("Kingdee.BOS")
clr.AddReference("Kingdee.BOS.Core")
from System import *
from Kingdee.BOS import *
from Kingdee.BOS.DataEntity import *
from Kingdee.BOS.Core import *
def OnPrepareNotePrintQueryParam(e):
	if e.DataSourceId.Equals("F_ora_Entity123456789012345",StringComparison.OrdinalIgnoreCase):
		entity = this.View.BillBusinessInfo.GetEntity("F_ora_Entity123456789012345");
		if entity is None:
			return;
		seqKey=entity.Key+"_"+entity.SeqFieldKey;
		tempList=filter(lambda x:x.Key.Equals(seqKey,StringComparison.OrdinalIgnoreCase),e.QueryParameter.SelectItems);
		if(len(tempList)<=0):
			return;
		tempList[0].PropertyName = seqKey.Substring(0,30);



image.png


效果:

image.png

补充说明:使用插件后,本质上将序号字段的标识截断为30个字符,也就是说原来的FFFFFF_YZDS_t_Cust_Entry111504_FSeq取不到值,而改为将数据存储为FFFFFF_YZDS_t_Cust_Entry111504,如下图模板所示:

image.png

(利用该功能能够做更高效的套打数据包干预,在取数层干预;而不是在数据包取完之后做动态字段注册;在特殊场景下拼接一个链表查询即可,欢迎试验交流)


以上就是本文的全部内容。

图标赞 2
2人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!

您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!

请选择打赏金币数 *

10金币20金币30金币40金币50金币60金币
可用金币: 0