How to save LU Attached File to a Database Directory in PLSQL in IFS (DOCMAN/Document Revision File)
- Rumesh Aponso (RMAX)

- Nov 13, 2024
- 2 min read
Updated: Nov 22, 2024
How to download a file in DOCMAN and save it in the database path [db server path]
DECLARE
company_ VARCHAR2(100) := '01';
invoice_id_ NUMBER := 100000;
out_dir_ VARCHAR2(250) := 'OUT_DIR';
CURSOR get_attached_doc_info IS
SELECT dro.doc_class doc_class,
dro.doc_no doc_no,
dro.doc_sheet doc_sheet,
dro.doc_rev doc_rev,
/*Edm_File_API.Get_Doc_Types_For_Document(doc_class, doc_no, doc_sheet, doc_rev) doc_type,*/
ef.file_name file_name,
efs.file_data file_data
FROM doc_reference_object dro, edm_file_tab ef, edm_file_storage_tab efs
WHERE dro.doc_class = ef.doc_class
AND dro.doc_no = ef.doc_no
AND dro.doc_sheet = ef.doc_sheet
AND dro.doc_rev = ef.doc_rev
AND ef.doc_class = efs.doc_class
AND ef.doc_no = efs.doc_no
AND ef.doc_sheet = efs.doc_sheet
AND ef.doc_rev = efs.doc_rev
AND ef.doc_type = efs.doc_type
AND ef.file_no = efs.file_no
AND dro.lu_name = 'InstantInvoice'
AND ef.file_type = 'ACROBAT'
AND SUBSTR(dro.key_ref, (INSTR(dro.key_ref, '=', 1, 1) + 1), (INSTR(dro.key_ref, '^', 1, 1) - (INSTR(dro.key_ref, '=', 1, 1) + 1))) = company_
AND SUBSTR(dro.key_ref, (INSTR(dro.key_ref, '=', 1, 2) + 1), (INSTR(dro.key_ref, '^', 1, 2) - (INSTR(dro.key_ref, '=', 1, 2) + 1))) = invoice_id_
ORDER BY dro.objversion DESC;
PROCEDURE Save_Pdf (
out_dir_ IN VARCHAR2,
file_name_ IN VARCHAR2,
pdf_ IN BLOB )
IS
v_lob_loc_ BLOB;
v_buffer_ RAW(32767);
v_buffer_size_ BINARY_INTEGER;
v_amount_ BINARY_INTEGER;
v_offset_ NUMBER(38) := 1;
v_chunksize_ INTEGER;
v_out_file_ utl_file.file_type;
BEGIN
v_lob_loc_ := pdf_;
v_chunksize_ := Dbms_LOB.Getchunksize(pdf_);
IF (v_chunksize_ < 32767) THEN
v_buffer_size_ := v_chunksize_;
ELSE
v_buffer_size_ := 32767;
END IF;
v_amount_ := v_buffer_size_;
BEGIN
Dbms_LOB.Open(v_lob_loc_, Dbms_LOB.LOB_READONLY);
v_out_file_ := Utl_File.Fopen(location => out_dir_,
filename => file_name_,
open_mode => 'wb',
max_linesize => 32767);
WHILE v_amount_ >= v_buffer_size_ LOOP
Dbms_LOB.Read(lob_loc => v_lob_loc_,
amount => v_amount_,
offset => v_offset_,
buffer => v_buffer_);
v_offset_ := v_offset_ + v_amount_;
Utl_File.Put_Raw(file => v_out_file_,
buffer => v_buffer_,
autoflush => true);
Utl_File.Fflush(file => v_out_file_);
END LOOP;
Utl_File.Fflush(file => v_out_file_);
Utl_FILE.Fclose(v_out_file_);
Dbms_Lob.Close(v_lob_loc_);
EXCEPTION
WHEN OTHERS THEN
Dbms_Lob.Close(v_lob_loc_);
RAISE;
END;
END Save_Pdf;
BEGIN
FOR doc_rec_ IN get_attached_doc_info LOOP
IF ((doc_rec_.doc_class IS NOT NULL) AND (doc_rec_.doc_no IS NOT NULL) AND (doc_rec_.doc_sheet IS NOT NULL) AND (doc_rec_.doc_rev IS NOT NULL)) THEN
IF ((doc_rec_.file_name IS NOT NULL) AND (doc_rec_.file_data IS NOT NULL)) THEN
Save_Pdf(out_dir_, doc_rec_.file_name, doc_rec_.file_data);
END IF;
END IF;
END LOOP;
END C_Send_Mail_With_Doc;



Comments