在Oracle并发程序中使用UTL_FILE无法将文件生成到目录

问题描述

我创建了从fnd_lobs表读取csv文件并在特定目录中生成文本文件的过程。 它可以通过PL sql和表单正常工作,但是当由oracle并发程序调用时,它没有生成文件。.有什么解决办法

declare
Errbuf varchar2(150);
RETcode varchar2(150);
begin
  XXTE_BSS_ERP_INT.EXTRACT_DATA_FNDLOBS(8279962,8619864,Errbuf,RETcode);
end;

Procedure EXTRACT_DATA_FNDLOBS(P_MO_NUMBER Number,P_LINE_ID   Number,errbuf      out VARCHAR2,retcode     out VARCHAR2) is
  
    CURSOR cur_new_attmt IS
      SELECT fl.file_id,fl.file_name,fl.file_data,dbms_lob.getlength(fl.file_data) file_length
      
        FROM FND_DOCUMENTS D,FND_ATTACHED_DOCUMENTS AD,Fnd_Lobs FL
       WHERE D.DOCUMENT_ID = AD.DOCUMENT_ID
         and fl.file_id = D.Media_Id
         and ad.entity_name = 'TRANSACT MOVE ORDER'
         and to_number(ad.pk1_value) = P_LINE_ID;
  
    v_start         NUMBER DEFAULT 1;
    v_bytelen       NUMBER DEFAULT 32000;
    v_len_copy      NUMBER;
    v_raw_var       RAW(32000);
    v_output        utl_file.file_type;
    v_inv_file_name VARCHAR2(100);
    V_FILE_NAME     Varchar2(250);
    v_position      NUMBER;
    V_CST_CHAR      varchar2(32760);
    V_CHECK_STEP    Varchar2(200);
    --v_first_rec     BOOLEAN DEFAULT TRUE;
    V_GENERATED_FILE UTL_FILE.FILE_TYPE;
    v_row            varchar2(1000);
    v1               varchar2(1000);
    V_MOVE_ORDER_NUM Varchar2(20);
    V_LINE_NUM       number;
    Att_line_num     number;
    att_SER_NUM      varchar2(30);
    att_INV_ITEM_ID  number;
    V_INV_ITEM_ID    Number;
    --V_FM_SERIAL_NUM  Varchar2(30);
    V_ITEM_CODE     Varchar2(30);
    V_FM_SERIAL_NUM Mtl_Serial_Numbers.Serial_Number%TYPE;
    V_LEN           Number;
    V_COUNT         number := 1;
    V_TRX_TEMP_ID   number;
    V_LINE_TRX_ID   Number;
    --------------check file--------------------
    V_EXIST    BOOLEAN;
    V_BLK_SIZE BINARY_INTEGER;
  
  BEGIN
    V_CHECK_STEP := 'Extract Data from attached file';
  
    v_position := 10;
    FOR rec_inv IN cur_new_attmt LOOP
      BEGIN
        v_inv_file_name := NULL;
        v_inv_file_name := rec_inv.file_name;
        v_position      := 20;
        -- define output directory AND OPEN THE file IN WRITE BYTE MODE,V_FILE_NAME := 'CRM_CPE_TRANS_' || '-' || rec_inv.file_id || '.txt';
      
        v_output   := utl_file.fopen('USER_DIR',V_FILE_NAME,'W' /*'wb'*/,32760);
        v_position := 30;
        -- maximum size OF buffer parameter IS 32767 BEFORE
        -- which you have TO flush  your buffer
        IF rec_inv.file_length < 32760 THEN
          utl_file.put_raw(v_output,rec_inv.file_data);
          --V_CST_CHAR := utl_raw.cast_to_varchar2(dbms_lob.substr(rec_inv.file_data));
          --utl_file.put_line(v_output,V_CST_CHAR);
          utl_file.fflush(v_output);
        
        ELSE
        
          v_position := 40;
          v_start    := 1;
          v_bytelen  := 32000;
          v_len_copy := rec_inv.file_length;
          dbms_output.put_line(v_len_copy);
        
          WHILE v_start < rec_inv.file_length AND v_bytelen > 0 LOOP
          
            dbms_lob.READ(rec_inv.file_data,v_bytelen,v_start,v_raw_var);
            utl_file.put_raw(v_output,v_raw_var);
          
            utl_file.fflush(v_output);
          
            v_start    := v_start + v_bytelen;
            v_len_copy := v_len_copy - v_bytelen;
          
            IF v_len_copy < 32000 THEN
              v_bytelen := v_len_copy;
            END IF;
          
          END LOOP;
          v_position := 80;
          utl_file.fclose(v_output);
        END IF;
        v_position := 90;
        dbms_output.put_line(' File_name:' || V_FILE_NAME);
      EXCEPTION
        WHEN OTHERS THEN
          dbms_output.put_line(rpad(NVL(v_inv_file_name,'NA'),31) ||
                               rpad('ERROR',21) || 'POSITION: ' ||
                               v_position || 'Error :' ||
                               SUBSTR(sqlERRM,1,1000));
      END;
    END LOOP;
  
    dbms_output.put_line('==========Insert File Data Into TABLE==========');
  
    begin
    
      V_GENERATED_FILE := UTL_FILE.FOPEN('USER_DIR','R');
    
      IF UTL_FILE.IS_OPEN(V_GENERATED_FILE) THEN
      
        LOOP
        
          BEGIN
          
            V_CHECK_STEP := 'Open the generated file from FND_LOBS and read data';
          
            UTL_FILE.GET_LINE(V_GENERATED_FILE,v_row);
            V_LEN := LENGTH(v_row);
            v1    := substr(v_row,V_LEN);
            v1    := REPLACE(REPLACE(v_row,CHR(13),','),CHR(10),');
          
            V_CHECK_STEP := 'Mapping the attached data to Serials table';
          
            if V_COUNT = 1 then
              -- rmv hdr
              null;
              V_COUNT := V_COUNT + 1;
            else
            
              V_MOVE_ORDER_NUM := REGEXP_SUBSTR(v1,'[^,]+',1);
              V_LINE_NUM       := REGEXP_SUBSTR(v1,2);
              V_ITEM_CODE      := REGEXP_SUBSTR(v1,3);
              V_FM_SERIAL_NUM  := REGEXP_SUBSTR(v1,4);
            
              begin
                select b.inventory_item_id
                  into V_INV_ITEM_ID
                  from Mtl_System_Items_b b
                 where b.segment1 = V_ITEM_CODE
                   and b.organization_id = 541;
              EXCEPTION
                WHEN NO_DATA_FOUND THEN
                  null;
              END;
            
              select XXTE_BSS_MO_SEQ.Nextval into V_LINE_TRX_ID from dual;
              INSERT INTO Xxte_Bss_Int_serials
                (MOVE_ORDER_NUM,LINE_NUM,INV_ITEM_ID,INV_ITEM_CODE,FM_SERIAL_NUM,RUN_RESULT,RUN_MSG,MO_LINE_ID,CREATION_DATE,LINE_TRX_ID)
              
              VALUES
                (V_MOVE_ORDER_NUM,V_LINE_NUM,V_INV_ITEM_ID,V_ITEM_CODE,V_FM_SERIAL_NUM,'Done',Null,P_LINE_ID,sysdate,V_LINE_TRX_ID);
              COMMIT;
            
              V_CHECK_STEP := 'Check the attached Move order with transaction order number';
              dbms_output.put_line('V_CHECK_STEP  ' || V_CHECK_STEP);
            
              if V_MOVE_ORDER_NUM != to_char(P_MO_NUMBER) then
                Update Xxte_Bss_Int_serials
                   set RUN_RESULT = 'Error',RUN_MSG = V_CHECK_STEP
                 where MOVE_ORDER_NUM = V_MOVE_ORDER_NUM
                   and MO_LINE_ID = P_LINE_ID
                   and LINE_TRX_ID = V_LINE_TRX_ID;
                commit;
              end if;
            
              V_CHECK_STEP := 'Check the attached Line number with transaction order number';
              begin
                select MTRL.Line_Number
                  into att_line_num
                  from MTL_TXN_REQUEST_LInes MTRL
                 where MTRL.Line_Id = P_LINE_ID;
              
                if V_LINE_NUM != att_line_num then
                  Update Xxte_Bss_Int_serials
                     set RUN_RESULT = 'Error',RUN_MSG = V_CHECK_STEP
                   where MOVE_ORDER_NUM = V_MOVE_ORDER_NUM
                     and MO_LINE_ID = P_LINE_ID
                     and LINE_TRX_ID = V_LINE_TRX_ID;
                  commit;
                end if;
              
              EXCEPTION
                WHEN NO_DATA_FOUND THEN
                  dbms_output.put_line('Error:   ' || V_CHECK_STEP ||
                                       '   ' || 'Line NUmber:  ' ||
                                       V_LINE_NUM);
              END;
            
              V_CHECK_STEP := 'Check the attached ITEM CODE with transaction order number';
              begin
                select MTRL.Inventory_Item_Id
                  into att_INV_ITEM_ID
                  from MTL_TXN_REQUEST_LInes MTRL
                 where MTRL.Line_Id = P_LINE_ID;
              
                if V_INV_ITEM_ID != att_INV_ITEM_ID then
                  Update Xxte_Bss_Int_serials
                     set RUN_RESULT = 'Error',RUN_MSG = V_CHECK_STEP
                   where MOVE_ORDER_NUM = V_MOVE_ORDER_NUM
                     and MO_LINE_ID = P_LINE_ID
                     and LINE_TRX_ID = V_LINE_TRX_ID;
                  commit;
                end if;
              EXCEPTION
                WHEN NO_DATA_FOUND THEN
                  dbms_output.put_line('Error:   ' || V_CHECK_STEP ||
                                       '   ' || 'ITEM CODE:  ' ||
                                       V_ITEM_CODE);
                  /*EXIT;*/
              end;
            
              V_CHECK_STEP := 'Check the attached Serial with transaction order number';
              begin
                select count(MSN.Serial_Number)
                  into att_SER_NUM
                  from MTL_SERIAL_NUMBERS MSN
                 where MSN.Inventory_Item_Id = V_INV_ITEM_ID
                   and MSN.Serial_Number = V_FM_SERIAL_NUM
                   and msn.current_status = 3
                   and msn.current_organization_id = 541
                   and msn.current_subinventory_code in
                       (select distinct l.from_subinventory_code
                          from Mtl_Txn_Request_Lines l
                         where l.line_id = P_LINE_ID);
                if att_SER_NUM = 0 then
                  /*if att_SER_NUM != V_FM_SERIAL_NUM then*/
                  Update Xxte_Bss_Int_serials
                     set RUN_RESULT = 'Error',RUN_MSG = V_CHECK_STEP
                   where MOVE_ORDER_NUM = V_MOVE_ORDER_NUM
                     and MO_LINE_ID = P_LINE_ID
                     and LINE_TRX_ID = V_LINE_TRX_ID;
                  commit;
                end if;
              EXCEPTION
                WHEN NO_DATA_FOUND THEN
                  dbms_output.put_line('Error:   ' || V_CHECK_STEP ||
                                       '   ' || 'Serial Number:  ' ||
                                       V_FM_SERIAL_NUM);
              end;
            end if; -- reomove headers
          
          EXCEPTION
          
            WHEN NO_DATA_FOUND THEN
            
              dbms_output.put_line('ERROR  ' || 'V_CHECK_STEP: ' ||
                                   V_CHECK_STEP || '  ' ||
                                   SUBSTR(sqlERRM,1000));
              EXIT;
          END;
          ------------------logs-----------------------------   
          FND_FILE.PUT_LINE(FND_FILE.LOG,V_MOVE_ORDER_NUM || ' -> ' || ' [ Serial = ' ||
                            V_FM_SERIAL_NUM || ' ] : ');
        
        END LOOP;
      
      END IF;
      UTL_FILE.FCLOSE(V_GENERATED_FILE);
    
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        dbms_output.put_line('ERROR  ' || 'V_CHECK_STEP: ' || V_CHECK_STEP);
      WHEN Others THEN
        dbms_output.put_line('ERROR  ' || 'V_CHECK_STEP: ' || V_CHECK_STEP);
    end;
  
    dbms_output.put_line('==========CHECK TEMP TRANSACTION==========');
  
    V_CHECK_STEP := 'Check allocation temp transaction';
  
    begin
      select TEMP.TRANSACTION_TEMP_ID
        into V_TRX_TEMP_ID
        from MTL_MATERIAL_TRANSACTIONS_TEMP TEMP
       where TEMP.Transaction_Source_Id = P_MO_NUMBER
         and TEMP.Trx_Source_Line_Id = P_LINE_ID;
    
      dbms_output.put_line('TEMP_TRANSACTION_ID =  ' || V_TRX_TEMP_ID);
    
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        Update Xxte_Bss_Int_serials
           set RUN_RESULT = 'Error',RUN_MSG = V_CHECK_STEP
         where MOVE_ORDER_NUM = V_MOVE_ORDER_NUM
           and LINE_NUM = P_LINE_ID;
        dbms_output.put_line('TEMP_TRANSACTION_ID =  ' || V_TRX_TEMP_ID);
    end;
    --for i in C_TRX_TEMP loop
    if V_TRX_TEMP_ID is not null then
      dbms_output.put_line('----------======================----------');
      dbms_output.put_line('==========Calling INSERT SERIALS==========');
      dbms_output.put_line('----------======================----------');
    
      V_CHECK_STEP := 'Calling INSERT SERIALS';
    
      INSERT_SERIAL_TRX(V_TRX_TEMP_ID /*i.transaction_temp_id*/,P_MO_NUMBER);
    else
      dbms_output.put_line('Check allocation');
      update XXTE_BSS_INT_SERIALS b
         set b.status = 'N'
       where b.move_order_num = to_char(P_MO_NUMBER)
         and b.mo_line_id = P_LINE_ID
         and LINE_TRX_ID = V_LINE_TRX_ID;
    end if;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      --end loop;---------logs----------------
      FND_FILE.PUT_LINE(FND_FILE.LOG,'TEEEEEE FILE_NAME');
      -------------------------------
    WHEN others THEN
      FND_FILE.PUT_LINE(FND_FILE.LOG,'TEEEEEE FILE_NAME');
    
  end;

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)