|
贡献点
CREATE OR REPLACE PROCEDURE xxosa_retrieve_fee_lob(errbuf OUT VARCHAR2
,retcode OUT NUMBER
,p_user_id IN NUMBER
,p_file_id IN NUMBER
)
IS
temp_blob BLOB;
data_buffer RAW(32767);
v_file_name VARCHAR2(30);
v_data VARCHAR2(32000);
amount BINARY_INTEGER;
amount2 BINARY_INTEGER;
amount1 BINARY_INTEGER;
error_number NUMBER;
error_message VARCHAR2 (100);
length_count INTEGER;
TYPE column_type IS TABLE OF VARCHAR2(500) INDEX BY BINARY_INTEGER;
v_column column_type;
-- 预计的行数一百万行
v_count NUMBER := 1000000;
BEGIN
SELECT file_data
,substr(file_name,instr(file_name,'/')+1,length(file_name))
INTO temp_blob
,v_file_name
FROM xxosa_lobs
WHERE file_id = p_file_id
;
FOR j IN 1..6
LOOP
v_column(j) := ' ';
END LOOP;
length_count := dbms_lob.getlength (temp_blob);
fnd_file.put_line (1,'Internal LOB size is: ' || length_count);
amount1 := 0;
FOR i IN 1..v_count LOOP
amount := dbms_lob.instr(temp_blob,utl_raw.cast_to_raw(','),1,6*i);
IF amount = 0 THEN
EXIT;
END IF;
fnd_file.put_line (1,'Internal LOB size is: ' || amount||':'||amount1);
IF i = 1 THEN
amount2 := amount - amount1 + 1;
ELSE
amount2 := amount - amount1;
END IF;
dbms_lob.read(temp_blob,amount2,amount1 + 1,data_buffer);
v_data := trim(utl_raw.cast_to_varchar2(data_buffer));
-- 屏蔽回车 换行 空格字符
v_data := replace(replace(replace(v_data,chr(10),''),chr(13),''),' ','');
FOR k IN 1..6 LOOP
IF k = 1 THEN
v_column(k) := substr(v_data,0,instr(v_data,',',k)-1);
ELSE
v_column(k) := substr(v_data,instr(v_data,',',1,k-1)+1,instr(v_data,',',1,k)-instr(v_data,',',1,k-1)-1);
END IF;
END LOOP;
IF i <> 1 THEN
INSERT INTO xxosa_outer_fee_data_tmp(
line_id
,line_no
,sold_from
,office
,time
,fee_type
,fee_amount
,attribute4
,file_id
,flag
,in_time
,last_update_date
,last_updated_by
,creation_date
,created_by
,last_update_login
) VALUES (
xxosa_outer_fee_data_tmp_s.nextval
,v_column(1)
,v_column(2)
,v_column(3)
,v_column(4)
,v_column(5)
,v_column(6)
,v_file_name
,p_file_id
,0
,to_number(to_char(sysdate,'YYYYMMDD'))
,sysdate
,p_user_id
,sysdate
,p_user_id
,p_user_id
);
COMMIT;
END IF;
amount1 := amount;
fnd_file.put_line (1,'data_buffer: ' || v_data);
END LOOP;
COMMIT;
fnd_file.put_line (1,'Exit the loop');
fnd_file.put_line (1,'Close the file');
EXCEPTION
WHEN OTHERS
THEN
error_number := SQLCODE;
error_message := SUBSTR (SQLERRM, 1, 100);
fnd_file.put_line (1,'Error #: ' || error_number);
fnd_file.put_line (1,'Error Message: ' || error_message);
END;
/ |
|