zoukankan      html  css  js  c++  java
  • 如何避免Oracle Form界面倒入.csv文件出现乱码

    create or replace package body XXACI_AP_IMPORT_PKG is
      
    -- Global variable
      g_pkg_name CONSTANT VARCHAR2(30) := 'XXACI_AP_IMPORT_PKG';
      
    -- Debug Enabled
      l_debug VARCHAR2(1) := nvl(fnd_profile.VALUE('AFLOG_ENABLED'), 'N');
      g_character_set CONSTANT 
    VARCHAR2(30) :=/*'ZHS16CGB231280';--*/ 'UTF8';
      g_max_field     CONSTANT 
    INTEGER := 10;
      TYPE g_extract_tbl 
    IS TABLE OF VARCHAR2(500);
      g_cells    g_extract_tbl;
      g_group_id 
    NUMBER;

      g_currency 
    varchar2(10);
      g_dr_ccid  
    number;

      
    procedure extract_blob(p_file_id       IN NUMBER,
                             p_file_name     
    in varchar2,
                             p_src_cs        
    IN VARCHAR2,
                             p_delimiter     
    IN VARCHAR2,
                             p_currency      
    in varchar2,
                             p_dr_ccid       
    in number,
                             x_group_id      OUT 
    NUMBER,
                             x_err_msg       OUT 
    VARCHAR2,
                             x_return_status OUT 
    VARCHAR2,
                             x_msg_count     OUT NOCOPY 
    NUMBER,
                             x_msg_data      OUT NOCOPY 
    VARCHAR2is
        l_api_name       CONSTANT 
    VARCHAR2(30) := 'extract_blob';
        l_api_version    CONSTANT 
    NUMBER := 1.0;
        l_savepoint_name CONSTANT 
    VARCHAR2(30) := 'sp_extract_blob01';

        l_data_b      BLOB :
    = NULL;
        l_data_c      CLOB :
    = NULL;
        l_pos         
    INTEGER;
        l_offset      
    INTEGER;
        l_clob_size   
    INTEGER;
        l_line_no     
    INTEGER;
        l_src_offset  
    INTEGER := 1;
        l_dest_offset 
    INTEGER := 1;
        l_buf         
    VARCHAR2(4000);
        l_warning     
    VARCHAR2(4000);
        l_ist_count   
    NUMBER;
        l_lang_ctx    
    INTEGER := dbms_lob.default_lang_ctx;

      
    BEGIN
        g_currency      :
    = p_currency;
        g_dr_ccid       :
    = p_dr_ccid;
        x_return_status :
    = xxaci_api.start_activity(p_pkg_name      => g_pkg_name,
                                                    p_api_name      
    => l_api_name,
                                                    p_init_msg_list 
    => fnd_api.g_true);

        
    IF x_return_status = fnd_api.g_ret_sts_error THEN
          RAISE fnd_api.g_exc_error;
        ELSIF x_return_status 
    = fnd_api.g_ret_sts_unexp_error THEN
          RAISE fnd_api.g_exc_unexpected_error;
        
    END IF;

        
    --g_group_id:=x_group_id;

        dbms_lob.createtemporary(l_data_c, FALSE, dbms_lob.session);

        
    --get CSV file ,save into l_data_b
        IF p_file_id IS NOT NULL THEN
          
    SELECT fl.file_data
            
    INTO l_data_b
            
    FROM fnd_lobs fl
           
    WHERE fl.file_id = p_file_id
             
    FOR UPDATE OF file_data;

          dbms_output.put_line(dbms_lob.getlength(l_data_b));

          
    --check the character set
          IF p_src_cs <> g_character_set THEN
            l_data_b :
    = convertblob(l_data_b, p_src_cs, g_character_set);
          
    END IF;

          dbms_output.put_line(
    'test');

          
    -- Convert the BLOB format to CLOB format
          dbms_lob.converttoclob(dest_lob     => l_data_c,
                                 src_blob     
    => l_data_b,
                                 amount       
    => dbms_lob.lobmaxsize,
                                 dest_offset  
    => l_dest_offset,
                                 src_offset   
    => l_src_offset,
                                 blob_csid    
    => nls_charset_id(g_character_set),
                                 lang_context 
    => l_lang_ctx,
                                 warning      
    => l_warning);

          dbms_output.put_line(dbms_lob.getlength(l_data_c));

          l_offset    :
    = 1;
          l_clob_size :
    = dbms_lob.getlength(l_data_c);
          l_line_no   :
    = 1;

          
    SELECT xxaci_mrp_forecast_temp_s.NEXTVAL INTO g_group_id FROM dual;

          x_group_id :
    = g_group_id;

          LOOP
            l_pos :
    = dbms_lob.instr(lob_loc => l_data_c,
                                    pattern 
    => chr(10),
                                    offset  
    => l_offset,
                                    nth     
    => 1);
            dbms_output.put_line(to_char(l_pos));
            
    IF nvl(l_pos, 0= 0 THEN
              l_pos :
    = l_clob_size + 1;
            
    END IF;

            l_buf    :
    = dbms_lob.substr(lob_loc => l_data_c,
                                        amount  
    => l_pos - l_offset, -- N_NEXT_POS - N_POS,
                                        offset  => l_offset); --N_POS+1);
            l_offset := l_pos + 1;

            
    --break down the fields into different columns by the Tab Delimiter
            extract_cell_data(p_line          => REPLACE(l_buf, chr(13)),
                              p_line_no       
    => l_line_no,
                              p_delimiter     
    => p_delimiter,
                              x_err_msg       
    => x_err_msg,
                              x_return_status 
    => x_return_status,
                              x_msg_count     
    => x_msg_count,
                              x_msg_data      
    => x_msg_data);

            
    EXIT WHEN l_pos > l_clob_size;
            l_line_no :
    = l_line_no + 1;
          
    END LOOP;

          
    COMMIT;

          
    SELECT COUNT(1)
            
    INTO l_ist_count
            
    FROM xxaci_mrp_forecast_temp mft
           
    WHERE mft.group_id = g_group_id;

          
    IF dbms_lob.istemporary(l_data_b) > 0 THEN
            dbms_lob.freetemporary(l_data_b);
          
    END IF;

          
    IF dbms_lob.istemporary(l_data_c) > 0 THEN
            dbms_lob.freetemporary(l_data_c);
          
    END IF;
        
    END IF;

        x_err_msg :
    = to_char(l_line_no - 1|| ' records in data file,' ||
                     l_ist_count 
    || ' processed successfully' || chr(10||
                     x_err_msg;

        dbms_output.put_line(
    'x_err_msg:' || x_err_msg);

        x_return_status :
    = xxaci_api.end_activity(p_pkg_name  => g_pkg_name,
                                                  p_api_name  
    => l_api_name,
                                                  p_commit    
    => fnd_api.g_false,
                                                  x_msg_count 
    => x_msg_count,
                                                  x_msg_data  
    => x_msg_data);

        dbms_output.put_line(
    'x_msg_data:' || x_msg_data);
      EXCEPTION
        
    WHEN no_data_found THEN

          x_return_status :
    = xxaci_api.handle_exceptions(p_pkg_name  => g_pkg_name,
                                                         p_api_name  
    => l_api_name,
                                                         p_exc_name  
    => xxaci_api.g_exc_name_error,
                                                         x_msg_count 
    => x_msg_count,
                                                         x_msg_data  
    => x_msg_data);
          fnd_msg_pub.count_and_get(p_encoded 
    => fnd_api.g_false,
                                    p_count   
    => x_msg_count,
                                    p_data    
    => x_msg_data);

          
    IF x_msg_count > 1 THEN
            x_msg_data :
    = fnd_msg_pub.get_detail(p_msg_index => fnd_msg_pub.g_first,
                                                 p_encoded   
    => fnd_api.g_false);
          
    END IF;

        
    WHEN fnd_api.g_exc_error THEN
          x_return_status :
    = xxaci_api.handle_exceptions(p_pkg_name  => g_pkg_name,
                                                         p_api_name  
    => l_api_name,
                                                         p_exc_name  
    => xxaci_api.g_exc_name_error,
                                                         x_msg_count 
    => x_msg_count,
                                                         x_msg_data  
    => x_msg_data);
          fnd_msg_pub.count_and_get(p_encoded 
    => fnd_api.g_false,
                                    p_count   
    => x_msg_count,
                                    p_data    
    => x_msg_data);

          
    IF x_msg_count > 1 THEN
            x_msg_data :
    = fnd_msg_pub.get_detail(p_msg_index => fnd_msg_pub.g_first,
                                                 p_encoded   
    => fnd_api.g_false);
          
    END IF;

        
    WHEN fnd_api.g_exc_unexpected_error THEN
          x_return_status :
    = xxaci_api.handle_exceptions(p_pkg_name  => g_pkg_name,
                                                         p_api_name  
    => l_api_name,
                                                         p_exc_name  
    => xxaci_api.g_exc_name_unexp,
                                                         x_msg_count 
    => x_msg_count,
                                                         x_msg_data  
    => x_msg_data);
          fnd_msg_pub.count_and_get(p_encoded 
    => fnd_api.g_false,
                                    p_count   
    => x_msg_count,
                                    p_data    
    => x_msg_data);

          
    IF x_msg_count > 1 THEN
            x_msg_data :
    = fnd_msg_pub.get_detail(p_msg_index => fnd_msg_pub.g_first,
                                                 p_encoded   
    => fnd_api.g_false);
          
    END IF;

        
    WHEN OTHERS THEN
          x_return_status :
    = xxaci_api.handle_exceptions(p_pkg_name  => g_pkg_name,
                                                         p_api_name  
    => l_api_name,
                                                         p_exc_name  
    => xxaci_api.g_exc_name_others,
                                                         x_msg_count 
    => x_msg_count,
                                                         x_msg_data  
    => x_msg_data);
          fnd_msg_pub.add_exc_msg(p_pkg_name       
    => g_pkg_name,
                                  p_procedure_name 
    => l_api_name,
                                  p_error_text     
    => substrb(SQLERRM, 1240));
          xxaci_conc_utl.log_message_list;
          x_msg_data :
    = SQLERRM;
      
    END extract_blob;
      
    -------------------------------
      PROCEDURE extract_cell_data(p_line          IN VARCHAR2,
                                  p_line_no       
    IN INTEGER,
                                  p_delimiter     
    IN VARCHAR2,
                                  x_err_msg       OUT 
    VARCHAR2,
                                  x_return_status OUT 
    VARCHAR2,
                                  x_msg_count     OUT NOCOPY 
    NUMBER,
                                  x_msg_data      OUT NOCOPY 
    VARCHAR2IS
        l_api_name       CONSTANT 
    VARCHAR2(30) := 'extract_cell_data';
        l_api_version    CONSTANT 
    NUMBER := 1.0;
        l_savepoint_name CONSTANT 
    VARCHAR2(30) := 'sp_extract_cell_data01';

        l_line          
    VARCHAR2(4000);
        l_field         
    VARCHAR2(4000);
        l_field_cnt     
    INTEGER;
        l_delimiter_pos 
    INTEGER;
        v_temp_id       
    number;

        v_ccid 
    number;
        
    --l_cell1         NUMBER;

        
    /*l_project_name   VARCHAR2(100);
        l_segment1       VARCHAR2(240);
        l_uom_code       VARCHAR2(10);
        l_currency_code  VARCHAR2(3);
        l_cj_vendor_name VARCHAR2(240);
        l_vendor_name    VARCHAR2(240);
        l_primary_flag   VARCHAR2(1);
        l_unit_price     NUMBER;
    */

      
    BEGIN
        x_return_status :
    = xxaci_api.start_activity(p_pkg_name      => g_pkg_name,
                                                    p_api_name      
    => l_api_name,
                                                    p_init_msg_list 
    => fnd_api.g_true);

        
    IF x_return_status = fnd_api.g_ret_sts_error THEN
          RAISE fnd_api.g_exc_error;
        ELSIF x_return_status 
    = fnd_api.g_ret_sts_unexp_error THEN
          RAISE fnd_api.g_exc_unexpected_error;
        
    END IF;

        g_cells :
    = g_extract_tbl();
        g_cells.EXTEND(g_max_field);
        l_field_cnt :
    = 1;

        
    IF p_line IS NOT NULL THEN
          
    -- extract values from field
          l_line := p_line;
          dbms_output.put_line(l_line);
          LOOP

            l_field         :
    = NULL;
            l_delimiter_pos :
    = instr(l_line, p_delimiter);
            
    IF l_delimiter_pos > 0 THEN
              l_field :
    = ltrim(rtrim(substr(l_line, 1, l_delimiter_pos - 1)));
              l_line  :
    = substr(l_line, l_delimiter_pos + 1);
            ELSIF 
    ltrim(rtrim(l_line)) IS NOT NULL THEN
              l_field :
    = ltrim(rtrim(l_line));
              l_line  :
    = NULL;
            
    END IF;

            dbms_output.put_line(to_char(l_field_cnt) 
    || '-' || l_field);
            
    --IF l_field IS NOT NULL THEN
            dbms_output.put_line(l_field);
            g_cells(l_field_cnt) :
    = l_field;
            
    --END IF;
            l_field_cnt := l_field_cnt + 1;
            
    -- exit when finish extract last field
            IF (l_line IS NULLOR (l_field_cnt = g_max_field) THEN
              
    EXIT;
            
    END IF;
          
    END LOOP;

          dbms_output.put_line(g_cells.
    COUNT);

          
    BEGIN
          v_ccid:
    =null;
            
    if g_cells(5is not null then
            
    begin
               
    select code_combination_id into v_ccid from
               gl_code_combinations 
    where
               segment1
    ||'.'||segment2||'.'||segment3||'.'||segment4||'.'||segment5||'.'||segment6=g_cells(5);
            exception
            
    when others then v_ccid:=null;
            
    end;
            
    end if;
            
    SELECT XXCUS_ATU.XXACI_AP_IMPORT_S.NEXTVAL
              
    into v_temp_id
              
    FROM DUAL;
            
    INSERT INTO xxaci_ap_import_tmp
              (vendor_num,
               header_description,
               line_amount,
               line_description,
               distribution_ccid,
               group_id,
               invoice_currency_code,
               temp_id)
            
    VALUES
              (g_cells(
    1),
               g_cells(
    2),
               g_cells(
    3),
               g_cells(
    4),
               nvl(v_ccid, g_dr_ccid),
               g_group_id,
               g_currency,
               v_temp_id);
            
    commit;
          EXCEPTION
            
    WHEN OTHERS THEN
              x_err_msg :
    = substrb(SQLERRM, 1240);
          
    END;
        
    END IF;

        x_return_status :
    = xxaci_api.end_activity(p_pkg_name  => g_pkg_name,
                                                  p_api_name  
    => l_api_name,
                                                  p_commit    
    => fnd_api.g_false,
                                                  x_msg_count 
    => x_msg_count,
                                                  x_msg_data  
    => x_msg_data);
      EXCEPTION
        
    WHEN no_data_found THEN

          x_return_status :
    = xxaci_api.handle_exceptions(p_pkg_name  => g_pkg_name,
                                                         p_api_name  
    => l_api_name,
                                                         p_exc_name  
    => xxaci_api.g_exc_name_error,
                                                         x_msg_count 
    => x_msg_count,
                                                         x_msg_data  
    => x_msg_data);
          fnd_msg_pub.count_and_get(p_encoded 
    => fnd_api.g_false,
                                    p_count   
    => x_msg_count,
                                    p_data    
    => x_msg_data);

          
    IF x_msg_count > 1 THEN
            x_msg_data :
    = fnd_msg_pub.get_detail(p_msg_index => fnd_msg_pub.g_first,
                                                 p_encoded   
    => fnd_api.g_false);
          
    END IF;

        
    WHEN fnd_api.g_exc_error THEN
          x_return_status :
    = xxaci_api.handle_exceptions(p_pkg_name  => g_pkg_name,
                                                         p_api_name  
    => l_api_name,
                                                         p_exc_name  
    => xxaci_api.g_exc_name_error,
                                                         x_msg_count 
    => x_msg_count,
                                                         x_msg_data  
    => x_msg_data);
          fnd_msg_pub.count_and_get(p_encoded 
    => fnd_api.g_false,
                                    p_count   
    => x_msg_count,
                                    p_data    
    => x_msg_data);

          
    IF x_msg_count > 1 THEN
            x_msg_data :
    = fnd_msg_pub.get_detail(p_msg_index => fnd_msg_pub.g_first,
                                                 p_encoded   
    => fnd_api.g_false);
          
    END IF;

        
    WHEN fnd_api.g_exc_unexpected_error THEN
          x_return_status :
    = xxaci_api.handle_exceptions(p_pkg_name  => g_pkg_name,
                                                         p_api_name  
    => l_api_name,
                                                         p_exc_name  
    => xxaci_api.g_exc_name_unexp,
                                                         x_msg_count 
    => x_msg_count,
                                                         x_msg_data  
    => x_msg_data);
          fnd_msg_pub.count_and_get(p_encoded 
    => fnd_api.g_false,
                                    p_count   
    => x_msg_count,
                                    p_data    
    => x_msg_data);

          
    IF x_msg_count > 1 THEN
            x_msg_data :
    = fnd_msg_pub.get_detail(p_msg_index => fnd_msg_pub.g_first,
                                                 p_encoded   
    => fnd_api.g_false);
          
    END IF;

        
    WHEN OTHERS THEN
          x_return_status :
    = xxaci_api.handle_exceptions(p_pkg_name  => g_pkg_name,
                                                         p_api_name  
    => l_api_name,
                                                         p_exc_name  
    => xxaci_api.g_exc_name_others,
                                                         x_msg_count 
    => x_msg_count,
                                                         x_msg_data  
    => x_msg_data);
          fnd_msg_pub.add_exc_msg(p_pkg_name       
    => g_pkg_name,
                                  p_procedure_name 
    => l_api_name,
                                  p_error_text     
    => substrb(SQLERRM, 1240));
          xxaci_conc_utl.log_message_list;
          x_msg_data :
    = SQLERRM;
      
    END extract_cell_data;

             

                成长

           /      |     \

        学习   总结   分享

    QQ交流群:122230156

  • 相关阅读:
    Palindrome Partitioning
    triangle
    Populating Next Right Pointers in Each Node(I and II)
    分苹果(网易)
    Flatten Binary Tree to Linked List
    Construct Binary Tree from Inorder and Postorder Traversal(根据中序遍历和后序遍历构建二叉树)
    iOS系统navigationBar背景色,文字颜色处理
    登录,注销
    ios 文字上下滚动效果Demo
    经常崩溃就是数组字典引起的
  • 原文地址:https://www.cnblogs.com/benio/p/1932832.html
Copyright © 2011-2022 走看看