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,发布整个代码,是不可能的,因为它与产品相关,因此受版权保护。