top of page

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

  • Writer: Rumesh Aponso (RMAX)
    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


Copyright © 2025 RMAXOneNote

  • Online CV
  • LinkedIn
  • Youtube
  • GitHub
  • Blogger
bottom of page