PL/SQL: numeric or value error 入参varchar2型长度问题。调存过报错,请教大神。

时间:2022-09-12 22:48:41
调存过报如下错误:
org.springframework.jdbc.BadSqlGrammarException: Hibernate-related JDBC operation; bad SQL grammar []; nested exception is java.sql.SQLException: ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 1

at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:97)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
at org.springframework.jdbc.supp


存过定义如下:
PROCEDURE PARTMERGE_801006(PI_INMSG   IN VARCHAR2, --入参消息体
                            PO_INMSG   OUT VARCHAR2, --出参消息体
                            PO_APPCODE OUT VARCHAR2,
                            PO_ERRMSG  OUT VARCHAR2) IS
  PRM_APPCODE    VARCHAR2(10);
  PRM_ERRMSG     VARCHAR2(1000); --错误信息
  V_LISTUNITRULE LONGCODEC_UTIL.NUMBER_TABLE := LONGCODEC_UTIL.DECODE('10,6,3,10');
  T_LISTCACHE    LONGCODEC_UTIL.VARCHAR2_TABLE_TABLE;
  V_RESULTSTRING VARCHAR2(32767);
 
 BEGIN
  /*INSERT INTO BBA3
   (PRO_NAME, PRO_MSG, SEQLOGID, AAE301)
  VALUES
   ('PKG_SBK_ZKSE4.PARTMERGE_801006', PI_INMSG, NULL, SYSDATE);*/
  T_LISTCACHE := LONGCODEC_UTIL.DECODELIST(PI_INMSG,
                                           V_LISTUNITRULE,
                                           V_RESULTSTRING,
                                           PRM_APPCODE,
                                           PRM_ERRMSG);
 
  FOR N IN T_LISTCACHE.FIRST .. T_LISTCACHE.LAST LOOP
   SZYTH.PKG_SBK_ZKSE4.PARTMERGE_801006(T_LISTCACHE(N) (1),
                                        T_LISTCACHE(N) (2),
                                        T_LISTCACHE(N) (3),
                                        T_LISTCACHE(N) (4),
                                        PRM_APPCODE,
                                        PRM_ERRMSG);
   IF PRM_APPCODE <> 0000 THEN
    PO_APPCODE := PRM_APPCODE;
    PO_ERRMSG  := PRM_ERRMSG;
    RETURN;
   END IF;
   PO_APPCODE := PRM_APPCODE;
  END LOOP;
 END PARTMERGE_801006;


错误描述:存过入参PI_INMSG为一段拼接的字符串,请问这个入参有无长度限制。我传入500条报文信息的时候没有报错,传入5000条时候报错,请问什么原因,感谢!!

8 个解决方案

#1


你报文平均长度是多少?对于varchar2来说,限制是32767字节

#2


引用 1 楼 hyee 的回复:
你报文平均长度是多少?对于varchar2来说,限制是32767字节


你好,入参传14500字节的时候不报错,传145000字节报错的。应该是你说的原因是吧。那我应该怎么改,换成clob吗?

#3


varchar2在PL/SQL变量定义时最大长度是32768

#4


BBA3表的PRO_MSG类型是多大,数据库表字段 varchar2最大长度4000

#5


引用 2 楼 liukaka2012 的回复:
Quote: 引用 1 楼 hyee 的回复:

你报文平均长度是多少?对于varchar2来说,限制是32767字节


你好,入参传14500字节的时候不报错,传145000字节报错的。应该是你说的原因是吧。那我应该怎么改,换成clob吗?


是,只能用clob,在java端你试着用setString传递看,我没测试过行不行,如果不行只能用Stream了,

#6


引用 4 楼 bw555 的回复:
BBA3表的PRO_MSG类型是多大,数据库表字段 varchar2最大长度4000


bba3表我已经注释掉了,现在基本确定是入参PI_INMSG长度太长,超过32767,现在我能直接改为clob类型吗?

#7


lob类型,操作方法和varchar2有很大差别,他有一套单独的用法,修改程序时需格外注意,具体用法可百度下

#8


该回复于2014-09-22 08:48:27被管理员删除

#1


你报文平均长度是多少?对于varchar2来说,限制是32767字节

#2


引用 1 楼 hyee 的回复:
你报文平均长度是多少?对于varchar2来说,限制是32767字节


你好,入参传14500字节的时候不报错,传145000字节报错的。应该是你说的原因是吧。那我应该怎么改,换成clob吗?

#3


varchar2在PL/SQL变量定义时最大长度是32768

#4


BBA3表的PRO_MSG类型是多大,数据库表字段 varchar2最大长度4000

#5


引用 2 楼 liukaka2012 的回复:
Quote: 引用 1 楼 hyee 的回复:

你报文平均长度是多少?对于varchar2来说,限制是32767字节


你好,入参传14500字节的时候不报错,传145000字节报错的。应该是你说的原因是吧。那我应该怎么改,换成clob吗?


是,只能用clob,在java端你试着用setString传递看,我没测试过行不行,如果不行只能用Stream了,

#6


引用 4 楼 bw555 的回复:
BBA3表的PRO_MSG类型是多大,数据库表字段 varchar2最大长度4000


bba3表我已经注释掉了,现在基本确定是入参PI_INMSG长度太长,超过32767,现在我能直接改为clob类型吗?

#7


lob类型,操作方法和varchar2有很大差别,他有一套单独的用法,修改程序时需格外注意,具体用法可百度下

#8


该回复于2014-09-22 08:48:27被管理员删除