Plsql 在Oracle PL/SQL中获取错误ORA-06502和ORA-06512

Plsql 在Oracle PL/SQL中获取错误ORA-06502和ORA-06512,plsql,oracle11g,Plsql,Oracle11g,我已经编写了一个程序,选择一些数据并插入到表中。代码已成功编译。但是,当我传递数据以执行该过程时,会出现如下错误: Error report - ORA-06502: PL/SQL: numeric or value error: character string buffer too small ORA-06512: at "CUSTOM.BPUBPF", line 51 ORA-06512: at line 7 06502. 00000 - "PL/SQL: numeric or valu

我已经编写了一个程序,选择一些数据并插入到表中。代码已成功编译。但是,当我传递数据以执行该过程时,会出现如下错误:

Error report -
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "CUSTOM.BPUBPF", line 51
ORA-06512: at line 7
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    An arithmetic, numeric, string, conversion, or constraint error
       occurred. For example, this error occurs if an attempt is made to
       assign the value NULL to a variable declared NOT NULL, or if an
       attempt is made to assign an integer larger than 99 to a variable
       declared NUMBER(2).
 *Action:   Change the data, how it is manipulated, or how it is declared so
       that values do not violate constraints.
MSG_SRL_NUM     HDR_SRL_NUM     CHECK_SUM                                   ACCOUNT_TYPE                                                                        ENTITYID                                                                            BILLERSRVID DOCNUM                                                                            STATUS    STATUS
47699           B910000007YH    1078478272                                                                                                                                                                                                                                                                                                R         R                   
47700           B910000007YH    1078478272                                                                                                                                                                                                                                                                                                 R        R                   
47701           B910000007YH    1078478272                                                                                                                                                                                                                                                                                              R       R                   
47702           B910000007YH    1078478272                                                                                                                                                                                                                                                                                               R      R                   
47703           B910000007YH    1078478272                                                                                                                                                                                                                                                                                                R         R                   
47704           B910000007YH    1078478272                                
失败的游标查询是:

    CURSOR cur_BPubpfRecordInsert1 (templateId VARCHAR2,userId VARCHAR2,moduleId VARCHAR2, parentFileName VARCHAR2,seqNextVal VARCHAR2,contextBankId VARCHAR2,
 fileType varchar2,fileChkSum varchar2, msdStat char) IS
   SELECT MSD.MSG_SRL_NUM,
    FHD.HDR_SRL_NUM,CHECK_SUM,nvl(SUBSTR(MSG_DATA,INSTR(MSG_DATA, '<PayerAcctType>') + LENGTH('<PayerAcctType>'),
    INSTR(MSG_DATA, '</PayerAcctType>') - (INSTR(MSG_DATA, '<PayerAcctType>') + LENGTH('<PayerAcctType>'))),' ')
    AS ACCOUNT_TYPE, nvl(SUBSTR(MSG_DATA,INSTR(MSG_DATA, '<PayerAcctNum>') + LENGTH('<PayerAcctNum>'),
    INSTR(MSG_DATA, '</PayerAcctNum>') - (INSTR(MSG_DATA, '<PayerAcctNum>') + LENGTH('<PayerAcctNum>'))),' ')
    AS ENTITYID, ' ' BILLERSRVID,
    nvl(SUBSTR(MSG_DATA,INSTR(MSG_DATA, '<PayerID>') + LENGTH('<PayerID>'),
    INSTR(MSG_DATA, '</PayerID>') - (INSTR(MSG_DATA, '<PayerID>') + LENGTH('<PayerID>'))), ' ') AS docNum,
    MSD.STATUS, FHD.STATUS FROM TBAADM.GD_FHD FHD,
    TBAADM.GD_MSD MSD WHERE MSD.BATCH_HDR_SRL_NUM = FHD.HDR_SRL_NUM AND
    MSD.FROM_TMPL_ID = FHD.FROM_TMPL_ID AND MSD.RCRE_USER_ID = FHD.RCRE_USER_ID
    AND MSD.MODULE_ID = FHD.MODULE_ID AND IN_OUT_FILE_NAME = parentFileName
    AND MSD.RCRE_USER_ID = userId AND MSD.FROM_TMPL_ID=templateId AND MSD.MODULE_ID = moduleId
    AND FHD.FILE_TYPE = fileType AND FHD.CHECK_SUM = fileChkSum  AND MSD.STATUS = msdStat;
  MSD.FROM_TMPL_ID = FHD.FROM_TMPL_ID AND MSD.RCRE_USER_ID = FHD.RCRE_USER_ID
select查询返回以下内容:

Error report -
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "CUSTOM.BPUBPF", line 51
ORA-06512: at line 7
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    An arithmetic, numeric, string, conversion, or constraint error
       occurred. For example, this error occurs if an attempt is made to
       assign the value NULL to a variable declared NOT NULL, or if an
       attempt is made to assign an integer larger than 99 to a variable
       declared NUMBER(2).
 *Action:   Change the data, how it is manipulated, or how it is declared so
       that values do not violate constraints.
MSG_SRL_NUM     HDR_SRL_NUM     CHECK_SUM                                   ACCOUNT_TYPE                                                                        ENTITYID                                                                            BILLERSRVID DOCNUM                                                                            STATUS    STATUS
47699           B910000007YH    1078478272                                                                                                                                                                                                                                                                                                R         R                   
47700           B910000007YH    1078478272                                                                                                                                                                                                                                                                                                 R        R                   
47701           B910000007YH    1078478272                                                                                                                                                                                                                                                                                              R       R                   
47702           B910000007YH    1078478272                                                                                                                                                                                                                                                                                               R      R                   
47703           B910000007YH    1078478272                                                                                                                                                                                                                                                                                                R         R                   
47704           B910000007YH    1078478272                                

我声明从游标获取值的变量是:

TYPE RecTyp IS RECORD (
lv_msdSrlNum                    varchar2(12) default null,
lv_fhdSrlNum                    varchar2(12) default null,
lv_chkSum                       VARCHAR2(40) default null,
lv_acctType                     varchar2(5)  default null,
lv_acctNo                       varchar2(40) default null,
lv_billerSrvId                  varchar2(35) default null,
lv_docId                        varchar2(20) default null,
lv_msdStatus                    char(1) default null,
lv_fhdStatus                    char(1)  default null
);

我无法理解为什么我的代码在那一行失败。

这还不是答案,但可能是一个提示。下面的查询为您返回了什么

 SELECT LENGTH(msd.msg_srl_num),
  LENGTH(fhd.hdr_srl_num),
  LENGTH(check_sum),
  LENGTH(NVL(SUBSTR(MSG_DATA,INSTR(MSG_DATA, '<PayerAcctType>') + LENGTH(
  '<PayerAcctType>'), INSTR(MSG_DATA, '</PayerAcctType>')       - (INSTR(
  MSG_DATA, '<PayerAcctType>')                                  + LENGTH(
  '<PayerAcctType>'))),' ')) AS account_type,
  LENGTH(NVL(SUBSTR(MSG_DATA,INSTR(MSG_DATA, '<PayerAcctNum>') + LENGTH(
  '<PayerAcctNum>'), INSTR(MSG_DATA, '</PayerAcctNum>')        - (INSTR(
  MSG_DATA, '<PayerAcctNum>')                                  + LENGTH(
  '<PayerAcctNum>'))),' ')) AS ENTITYID,
  ' ' billersrvid,
  LENGTH(NVL(SUBSTR(MSG_DATA,INSTR(MSG_DATA, '<PayerID>') + LENGTH('<PayerID>')
  , INSTR (MSG_DATA, '</PayerID>')                        - (INSTR(MSG_DATA,
  '<PayerID>')                                            + LENGTH('<PayerID>')
  )), ' ' )) AS docnum,
  LENGTH(msd.status),
  LENGTH(FHD.STATUS)
   FROM TBAADM.GD_FHD FHD,
  TBAADM.GD_MSD MSD
  WHERE MSD.BATCH_HDR_SRL_NUM = FHD.HDR_SRL_NUM
  AND MSD.FROM_TMPL_ID        = FHD.FROM_TMPL_ID
  AND MSD.RCRE_USER_ID        = FHD.RCRE_USER_ID
  AND MSD.MODULE_ID           = FHD.MODULE_ID
  AND IN_OUT_FILE_NAME        = parentFileName
  AND msd.rcre_user_id        = userid
  AND msd.from_tmpl_id        =templateid
  AND msd.module_id           = moduleid
  AND FHD.FILE_TYPE           = fileType
  AND FHD.CHECK_SUM           = fileChkSum
  AND MSD.STATUS              = msdStat;
选择长度(msd.msg\u srl\u num),
长度(fhd.hdr\u srl\u num),
长度(校验和),
长度(NVL(SUBSTR(MSG_数据,INSTR(MSG_数据)”)+长度(
''),仪表(信息和数据),-(仪表(
MSG_数据“”)+长度(
''),'')作为账户类型,
长度(NVL(SUBSTR(MSG_数据,INSTR(MSG_数据)”)+长度(
''),仪表(信息和数据),-(仪表(
MSG_数据“”)+长度(
''),'')作为实体ID,
“”billersrvid,
长度(NVL(SUBSTR(MSG_数据,INSTR(MSG_数据)”)+长度(“”)
,INSTR(MSG_数据),-(INSTR(MSG_数据,
'')+长度('')
)),'')作为docnum,
长度(msd状态),
长度(FHD状态)
来自TBAADM.GD_FHD FHD,
TBAADM.GD_MSD MSD
其中MSD.BATCH_HDR_SRL_NUM=FHD.HDR_SRL_NUM
MSD.FROM_TMPL_ID=FHD.FROM_TMPL_ID
MSD.RCRE_USER_ID=FHD.RCRE_USER_ID
和MSD.MODULE_ID=FHD.MODULE_ID
和IN\u OUT\u FILE\u NAME=parentFileName
msd.rcre\u user\u id=userid
和msd.from_tmpl_id=templateid
和msd.module_id=moduleid
和FHD.FILE_TYPE=fileType
和FHD.CHECK_SUM=fileChkSum
和MSD.STATUS=msdStat;

您好,我检查了长度。它们分别是:5,12,10,1,1,1,1,1。因此,记录类型的变量应该成功地保存它们。请发布您的代码。可能在其他地方发生了错误。不可能猜到为什么仅仅看你提供的信息不起作用。@XING,发布整个代码,是不可能的,因为它与产品相关,因此受版权保护。