【案例91】记一次高级版升级环境报错“fail to save VO Array”
问题现象
YonBIP高级版 2305(2207SP) 正式环境升级报错fail to save VO Array ~#@:
问题分析
YonBIP高级版 2305(2207SP) 正式环境升级报错fail to save VO Array日志文件为:
nchome/nclogs/server/am-log*.log
$$callid= $$thread=[InstallDBThread] $$host= $$userid= $$ts=2024-06-15 14:10:01 $$debuglevel=ERROR $$msg=fail to save VO Array ~#@
nc.md.model.MetaDataException: fail to save VO Array ~#@
at nc.md.persist.framework.imp.VOPersister.saveItemHas(VOPersister.java:749)
at nc.md.persist.framework.imp.VOPersister.saveItems(VOPersister.java:690)
at nc.md.persist.framework.imp.VOPersister.saveVOS(VOPersister.java:285)
at nc.md.persist.framework.imp.MDBaseDAO.handleBill(MDBaseDAO.java:55)
at nc.md.persist.framework.imp.MDBaseDAO.saveBill(MDBaseDAO.java:96)
at nc.md.persist.framework.imp.MDBaseDAO.saveBill(MDBaseDAO.java:85)
.....
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at nc.bs.framework.ejb.AbstractEJBServiceHandler.invoke(AbstractEJBServiceHandler.java:58)
at nc.bs.framework.ejb.AbstractEJBServiceHandler.invoke(AbstractEJBServiceHandler.java:36)
at jdk.proxy2/jdk.proxy2.$Proxy26.delegate(Unknown Source)
at nc.bs.framework.ejb.CMTEJBServiceHandler.invoke(CMTEJBServiceHandler.java:32)
at jdk.proxy2/jdk.proxy2.$Proxy622.saveBill(Unknown Source)
at nc.impl.bd.material.pf.MaterialPfServiceImpl.insertTabs(MaterialPfServiceImpl.java:344)
at nc.impl.bd.material.pf.MaterialPfServiceImpl.insertMaterialTabs(MaterialPfServiceImpl.java:310)
at nc.impl.bd.material.pf.MaterialPfServiceImpl.insertMaterialPFBaseVO(MaterialPfServiceImpl.java:250)
at nc.impl.bd.material.pf.MaterialPfServiceImpl.upgradeMaterialPfVO(MaterialPfServiceImpl.java:502)
...........
at jdk.proxy2/jdk.proxy2.$Proxy26.delegate(Unknown Source)
at nc.bs.framework.ejb.CMTEJBServiceHandler.invoke(CMTEJBServiceHandler.java:32)
at jdk.proxy2/jdk.proxy2.$Proxy784.upgradeMaterialPfVO(Unknown Source)
at nccloud.pubimpl.uapbd.basedoc.BaseDocPfUpdateForVersion.upgradeMaterialPfVos(BaseDocPfUpdateForVersion.java:415)
at nccloud.pubimpl.uapbd.basedoc.BaseDocPfUpdateForVersion.updateMaterialPf(BaseDocPfUpdateForVersion.java:377)
at nccloud.pubimpl.uapbd.basedoc.BaseDocPfUpdateForVersion.doAfterUpdateData(BaseDocPfUpdateForVersion.java:97)
at nc.bs.sm.accountmanage.AccountCreateImpl.classAdjust_RequiresNew(AccountCreateImpl.java:74)
............
at nc.bs.framework.ejb.AbstractEJBServiceHandler.invoke(AbstractEJBServiceHandler.java:36)
at jdk.proxy2/jdk.proxy2.$Proxy26.delegate_RequiresNew(Unknown Source)
at nc.bs.framework.ejb.CMTEJBServiceHandler.invoke(CMTEJBServiceHandler.java:30)
at jdk.proxy2/jdk.proxy2.$Proxy651.classAdjust_RequiresNew(Unknown Source)
at nc.bs.sm.accountmanage.AccountManageImpl.doinstallSingleModule(AccountManageImpl.java:2185)
at nc.bs.sm.accountmanage.AccountManageImpl.doInstallModule(AccountManageImpl.java:1698)
at nc.bs.sm.accountmanage.AccountManageImpl.doInstallProduct(AccountManageImpl.java:1297)
at nc.bs.sm.accountmanage.AccountManageImpl.doInstallDB(AccountManageImpl.java:667)
at nc.bs.sm.accountmanage.AccountManageImpl.doInstallDB(AccountManageImpl.java:585)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
..........
at nc.bs.framework.aop.rt.AspectedProxy.invoke(AspectedProxy.java:60)
at jdk.proxy3/jdk.proxy3.$Proxy649.doInstallDB(Unknown Source)
at nc.bcmanage.bs.BusiCenterManageImpl$InstallRunnable.run(BusiCenterManageImpl.java:384)
at java.base/java.lang.Thread.run(Thread.java:840)
Caused by: nc.bs.dao.DAOException: sql:INSERT INTO bd_materialcost_pf (pk_group,pk_materialcost,modifier,dr,pk_org,pk_material,def30,def31,def32,dataoriginflag,def33,def34,def35,def36,def37,def38,def39,def20,def21,def22,def23,def24,def25,def26,def27,def28,creationtime,def29,costprice,modifiedtime,def10,def11,def12,def13,def14,def15,def16,def17,def18,def19,def3,def4,def1,creator,def2,def40,def9,def7,def8,def5,def6) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
ORA-00001: 违反唯一约束条件 (JKBIP.I_MATERIALCOST_PF_1)
at nc.bs.dao.BaseDAO.insertObjectWithPK(BaseDAO.java:742)
at nc.md.persist.framework.imp.VOPersister.saveItemHas(VOPersister.java:737)
根据日志发现是 ORA-00001: 违反唯一约束条件 (JKBIP.I_MATERIALCOST_PF_1)
根据和开发沟通,该索引I_MATERIALCOST_PF_1可以去掉:
Caused by:
nc.bs.dao.DAOException:sql:INSERT INTO bd_materialcost_pf (pk_group,pk_materialcost,modifier,dr,pk_org,pk_material,def30,def31,def32,dataoriginflag,def33,def34,def35,def36,def37,def38,def39,def20,def21,def22,def23,def24,def25,def26,def27,def28,creationtime,def29,costprice,modifiedtime,def10,def11,def12,def13,def14,def15,def16,def17,def18,def19,def3,def4,def1,creator,def2,def40,def9,def7,def8,def5,def6) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
ORA-00001: 违反唯一约束条件 (JKBIP.I_MATERIALCOST_PF_1)
项目顾问在数据库执行 drop index I_MATERIALCOST_PF_1 后,
账套升级 仍然报错: fail to save VO Array
解决方案
在nchome的文件fi_nc_pub_bd.sql中找到创建索引的脚本,然后从fi_nc_pub_bd.sql
文件中删除掉,再次账套升级,不再报错,可以正常升级。
home\ncscript\ria\uapbd\L_0\dbcreate\SQLSERVER\00002\fi_nc_pub_bd.sql