| 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 - Records
read = ' || 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);
![]() |
![]() |