设为首页 收藏本站
查看: 586|回复: 0

[经验分享] Oracle 存储过程读文件

[复制链接]

尚未签到

发表于 2016-7-20 10:21:30 | 显示全部楼层 |阅读模式
create or replace
PROCEDURE PR_FINANCE_PRODUCT_PARSE
(
v_filename  IN  VARCHAR2,   --解析文件名称
v_retvalue  OUT NUMBER      --1为成功,0为失败      
)
AS
    --文件句柄
    filehandle utl_file.file_type;
    --缓冲区
    filebuffer varchar2(255);  
    --文件名
    lv_filename varchar2(100);   
    --文件到表字段的映射
    lv_product_number  varchar2(255);
    lv_product_name    varchar2(255);
    lv_min_capital     varchar2(255);
    lv_max_capital     varchar2(255);
    lv_interest_rate   varchar2(255);
    lv_begin_time      varchar2(255);
    lv_end_time        varchar2(255);
    lv_time_limit      varchar2(255);
    lv_product_status  varchar2(255);  
    --列指针   
    lv_i number;   
    --字符串定位解析指针   
    lv_sposition1 number;
    lv_sposition2 number;
    lv_sposition3 number;
    lv_sposition4 number;
    lv_sposition5 number;
    lv_sposition6 number;
    lv_sposition7 number;
    lv_sposition8 number;
   
     --声明异常
    invalid_data_format  exception;
   
BEGIN
   
    if v_filename is null then
      lv_filename:='finance_product_'|| to_char(sysdate,'YYYYMMDD') ||'.txt' ;
    else
      lv_filename := v_filename;
    end if;        
   
    --打开一个文件句柄 ,同时fopen的第一个参数必须是大写
    filehandle := utl_file.fopen('FINANCE_PRODUCT_DIR',lv_filename,'r');

    --if UTL_FILE.IS_OPEN(filehandle) then   
    --   EXECUTE IMMEDIATE 'truncate table T_FINANCING_PRODUCT';
    --end if;

   Loop   
      begin
          --将文件信息读取到缓冲区filebuffer中,每次读取一行               
          utl_file.get_line(filehandle,filebuffer);            
         dbms_output.put_line(filebuffer);  
         filebuffer:=CONVERT(filebuffer,'UTF8','ZHS16GBK'); --转化汉字,处理乱码  
                     
          --数据文件一行字符串中数据分割符'|'的位置                                                   
          lv_sposition1 := instr(filebuffer, '|', 1,1);   
          lv_sposition2 := instr(filebuffer, '|', 1,2);
          lv_sposition3 := instr(filebuffer, '|', 1,3);
          lv_sposition4 := instr(filebuffer, '|', 1,4);
          lv_sposition5 := instr(filebuffer, '|', 1,5);
          lv_sposition6 := instr(filebuffer, '|', 1,6);
          lv_sposition7 := instr(filebuffer, '|', 1,7);
          lv_sposition8 := instr(filebuffer, '|', 1,8);
         
          --字符串解析正常情况  
          if lv_sposition1 <>0 then                                    
             lv_product_number := substr(filebuffer, 0, lv_sposition1-1);                               --第一列
          else
             raise invalid_data_format;
          end if;
          if lv_sposition2 <> 0 then                                    
             lv_product_name := substr(filebuffer, lv_sposition1+1, lv_sposition2-lv_sposition1-1);
--CONVERT(substr(filebuffer, lv_sposition1+1, lv_sposition2-lv_sposition1-1),'AL32UTF8','ZHS16GBK'); --第二列
          else
             raise invalid_data_format;
          end if;
          if lv_sposition3 <> 0 then                                    
            lv_min_capital := substr(filebuffer, lv_sposition2+1, lv_sposition3-lv_sposition2-1);         --第三列
          else
             raise invalid_data_format;
          end if;
          if lv_sposition4 <> 0 then                                    
             lv_max_capital  := substr(filebuffer, lv_sposition3+1, lv_sposition4-lv_sposition3-1);        --第四列
          else
             raise invalid_data_format;
          end if;   
          if lv_sposition5 <> 0 then                                    
             lv_interest_rate  := substr(filebuffer, lv_sposition4+1, lv_sposition5-lv_sposition4-1);      --第五列
          else
             raise invalid_data_format;
          end if;
           if lv_sposition6 <> 0 then                                    
             lv_begin_time  := substr(filebuffer, lv_sposition5+1, lv_sposition6-lv_sposition5-1);          --第六列  
          else
             raise invalid_data_format;
          end if;
           if lv_sposition7 <> 0 then                                    
              lv_end_time := substr(filebuffer, lv_sposition6+1, lv_sposition7-lv_sposition6-1);             --第七列
          else
             raise invalid_data_format;
          end if;
          if lv_sposition8 <> 0 then                                    
             lv_time_limit  := substr(filebuffer, lv_sposition7+1, lv_sposition8-lv_sposition7-1);            --第八列
             lv_product_status := substr(filebuffer, lv_sposition8+1);                                        --第九列
          else
             raise invalid_data_format;
          end if;
         
          --每列循环完后将信息保存到表中
          dbms_output.put_line('insert data into table');
          insert into T_FINANCING_PRODUCT
          (
          PRODUCT_NUMBER,
          PRODUCT_NAME,
          MIN_CAPITAL,
          MAX_CAPITAL,
          INTEREST_RATE,
          BEGIN_TIME,
          END_TIME,
          TIME_LIMIT,
          PRODUCT_STATUS
          )
          values
          (
          lv_product_number,
          lv_product_name,
          lv_min_capital,
          lv_max_capital,
          lv_interest_rate,
          lv_begin_time,
          lv_end_time,
          lv_time_limit,
          lv_product_status
          );
      exception
             WHEN no_data_found THEN
             exit ;
      end;  
    End Loop;
       delete from T_FINANCING_PRODUCT where to_char(OPERATION_DATE,'YYYYMMDD')=to_char(sysdate-1,'YYYYMMDD');
       commit;
      --关闭句柄        
      utl_file.fclose(filehandle);   
      v_retvalue :=1;   
EXCEPTION
    WHEN invalid_data_format THEN
        v_retvalue :=0;
        rollback;
        dbms_output.put_line('invalid_data_format exception');
    when others then         
       v_retvalue :=0;
       rollback;
       dbms_output.put_line('Othre exception,error code='||sqlcode||',error msg='||sqlerrm);  
END PR_FINANCE_PRODUCT_PARSE;

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-246776-1-1.html 上篇帖子: oracle创建DBLIK 反问报错 下篇帖子: Oracle-ddl相关命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表