Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Usenet -> c.d.o.server -> ORA-06502: PL/SQL: numeric or value error: character string buffer too small
Hi,
I'm processing a large file with the following data:
0AAA320000A
0AAA334000A
0AAA343000A
0AAA354000A
0AAA365000A
Total rows: 467381
When run PL/SQL get the following error:
DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too
small
ORA-06512: at "SYS.UTL_FILE", line 611 ORA-06512: at line 163 ORA-06512: at line 508 PL/SQL =====================================================
@/llbean/&1/interface/tomax
SET TERM OFF
SET SERVEROUTPUT ON SIZE 500000
DEFINE env = &1
SPOOL /llbean/&env/interface/import/pricelist.log;
DECLARE lv_directory_txt VARCHAR2(29) := '/llbean/&env/interface/import';
lv_ifilename_txt VARCHAR2(12) := 'prlstdtl.dat'; lv_ifile_id_num UTL_FILE.FILE_TYPE; lv_buffer_txt VARCHAR2(15); lv_discrate_txt VARCHAR2(12) := 'discrate.dat'; lv_discrate_id_num UTL_FILE.FILE_TYPE; lv_discrate_rec VARCHAR2(15); lv_upc_id VARCHAR2(10); lv_sku_no NUMBER(09); lv_pct NUMBER(5,2) := 0.0; lv_seq NUMBER(12) := 0; line_out VARCHAR2(1000); recs_read NUMBER(09) := 0; rows_inserted NUMBER(09) := 0; rows_updated NUMBER(09) := 0; lv_wng NUMBER(09) := 0; lv_ts VARCHAR2(32); lv_cnt NUMBER(12) := 0; lv_pstat attribute_list_value.code_value%TYPE; lv_nbr_hdrs INTEGER := 0; lv_plid price_list_hdr.price_list_id%TYPE; lv_cgy CHAR(1); lv_name price_list_hdr.name%TYPE; ix INTEGER; ixd INTEGER; ixh INTEGER; rc NUMBER(04) := 0; lv_dr_sz INTEGER; lv_cmt_ctr NUMBER(12) := 10000; TYPE array IS table of varchar(17) index by binary_integer; lv_dr array;
c_hdr_rec price_list_hdr%ROWTYPE;
PROCEDURE prlstdtl IS
BEGIN
--
BEGIN <<read_file>> UTL_FILE.GET_LINE(lv_discrate_id_num, lv_discrate_rec); EXCEPTION WHEN NO_DATA_FOUND THEN IF ix = 1 THEN dbms_output.put_line ('ABEND - EMPTY DISCRATE FILE'); EXIT; ELSE dbms_output.put_line ('END OF DISCRATE FILE'); EXIT; END IF; END read_file; lv_dr(ix) := lv_discrate_rec; dbms_output.put_line ('DISCRATE ARRAY REC ' || to_char(ix, '09999') || ' = ' || lv_dr(ix)); lv_dr_sz := ix; ix := ix + 1; end loop; IF ix = 1 THEN rc:=8; GOTO abend; END IF;
IF (lv_seq IS NULL or lv_seq < 1) THEN lv_seq:=1; END IF; line_out := 'Next PRLSTDTL SEQ_NO = ' || lv_seq; DBMS_OUTPUT.PUT_LINE(line_out);
--
line_out := 'Number of Classes from PRICE_LIST_HDR = ' || lv_nbr_hdrs;
DBMS_OUTPUT.PUT_LINE(line_out);
--
line_out := 'AFTER OPEN RECORD'; DBMS_OUTPUT.PUT_LINE(line_out);
line_out := 'BEFORE READ RECORD'; DBMS_OUTPUT.PUT_LINE(line_out);
--
line_out := 'AFTER READ RECORD'; DBMS_OUTPUT.PUT_LINE(line_out);
--
recs_read := recs_read + 1;
lv_upc_id := SUBSTR(lv_buffer_txt,1,10); lv_cgy := SUBSTR(lv_buffer_txt,11,1);
--
EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('WARNING - SKU NOT FOUND for UPC = ' || lv_upc_id); lv_wng:=lv_wng+1; GOTO toll; WHEN OTHERS THEN line_out := '** ERROR: '|| SQLCODE || ':'||SQLERRM||'**'; DBMS_OUTPUT.PUT_LINE(line_out); rc:=12; GOTO abend; END sel_sku;
--
--
IF ( lv_plid = SUBSTR(lv_dr(ixd),1,1) AND lv_cgy = SUBSTR(lv_dr(ixd),6,1) ) THEN lv_pct := SUBSTR(lv_dr(ixd),11,4); ix := NULL; END IF; ixd := ixd + 1; IF ixd > lv_dr_sz THEN ixd := NULL; END IF; END LOOP;
--
IF (lv_plid = 1 AND lv_pstat <> 'A') THEN lv_pct := 25.00; END IF; IF lv_cnt = 0 THEN
--
--
EXCEPTION WHEN OTHERS THEN line_out := '** ERROR: '|| SQLCODE || ':'||SQLERRM||'**'; DBMS_OUTPUT.PUT_LINE(line_out); rc:=12; GOTO abend; END insert_prlstdtl; rows_inserted := rows_inserted + 1; lv_seq := lv_seq + 1; ELSE
--
rows_updated := rows_updated + 1;
END IF;
ixh:=ixh+1; END LOOP;
IF ((rows_updated + rows_inserted) >= lv_cmt_ctr) THEN COMMIT; line_out := 'COMMITTED CHANGES TO Data Base - Recordsread = ' || recs_read ||' Rows processed = ' || (rows_updated + rows_inserted);
DBMS_OUTPUT.PUT_LINE(line_out); lv_ts := 'Time is: '|| to_char(sysdate,'yyyy-mm-dd_hh:mm:ss'); DBMS_OUTPUT.PUT_LINE(lv_ts); lv_cmt_ctr := lv_cmt_ctr + 10000; END IF; END commit_changes;
END LOOP toll;
--
<<abend>>
--
THEN line_out := 'Recs Read: '|| recs_read || ' - Rows Inserted: '|| rows_inserted; DBMS_OUTPUT.PUT_LINE(line_out); line_out := 'Recs Read: '|| recs_read || ' - Rows Updated: '|| rows_updated; DBMS_OUTPUT.PUT_LINE(line_out); IF ((rows_inserted + rows_updated) <> ((recs_read * lv_nbr_hdrs) - (lv_wng * lv_nbr_hdrs))) THEN rc:=8; line_out := 'ABEND - Rows INSERTED + Rows UPDATED does not equal records READ * HDRs (minus warnings * HDRs)'; DBMS_OUTPUT.PUT_LINE(line_out); line_out := 'Rows processed('||(rows_inserted +rows_updated)||') should equal records READ('||recs_read||') * HDRs('||lv_nbr_hdrs||') - minus warnings * HDRs('||(lv_wng * lv_nbr_hdrs)||')';
DBMS_OUTPUT.PUT_LINE(line_out); ELSE line_out := 'Rows processed('||(rows_inserted +rows_updated)||') should equal records READ('||recs_read||') * HDRs('||lv_nbr_hdrs||') - minus warnings * HDRs('||(lv_wng * lv_nbr_hdrs)||')';
DBMS_OUTPUT.PUT_LINE(line_out); line_out := 'Last PRLSTDTL SEQ_NO = ' || (lv_seq); DBMS_OUTPUT.PUT_LINE(line_out); END IF; END IF; END audit_stats;
BEGIN <<close_files>> UTL_FILE.FCLOSE_ALL; END close_files; line_out := 'FILES CLOSED'; DBMS_OUTPUT.PUT_LINE(line_out);
prlstdtl;
lv_ts := 'END : '|| to_char(sysdate,'yyyy-mm-dd_hh:mm:ss');
DBMS_OUTPUT.PUT_LINE(lv_ts); line_out := '**'; DBMS_OUTPUT.PUT_LINE(line_out); line_out := 'RC = ' || rc; DBMS_OUTPUT.PUT_LINE(line_out);