oracle 存储过程批量生成sqlldr控制文件

oracle 存储过程批量生成sqlldr控制文件


由于使用oracle的sqlldr导入多个文件和表的时候,需要编辑多个控制文件,数量多的时候耗费时间较长,可以通过编写存储过程用UTL_FILE.FILE_TYPE文件包批量生成脚本
1.创建数据库目录

  create or replace directory  D1 as '/tmp/back'; --文件系统路径

2.授权用户使用权限

grant read,write on directory BLOB_FILE_DIR to gzj;--路径授权,添加对路径读、写权限
grant execute on utl_file to gzj;--utl_file包授权,添加执行权限

3.将需要导入的表明插入一张临时表做表明读取使用

4.存储过程脚本

declare  
file_ctl  varchar2(4000);
maxnum number;
vc_filename     UTL_FILE.FILE_TYPE;
own varchar2(40);
cursor table_name  is  select TABLSE_NAME from ee_t.my_table;  
begin 
   DBMS_OUTPUT.ENABLE (buffer_size=>null);
   own:='PRE_CCRS';
   for i in table_name loop
      file_ctl:=i.TABLSE_NAME||'.ctl';  ------文件名称
      dbms_output.put_line(file_ctl);
      vc_filename:= UTL_FILE.FOPEN('D1', file_ctl , 'w');   ---打开路径,文件写进内容
      UTL_FILE.PUT_LINE(vc_filename,'load'); 
      UTL_FILE.NEW_LINE(vc_filename,0);
      UTL_FILE.PUT_LINE(vc_filename,'infile /u01/backup/sdata/'||i.TABLSE_NAME||'.csv');
      UTL_FILE.NEW_LINE(vc_filename,0);
      UTL_FILE.PUT_LINE(vc_filename,'append into table  '||'ee_t.'||i.TABLSE_NAME);
      UTL_FILE.NEW_LINE(vc_filename,0);
      UTL_FILE.PUT_LINE(vc_filename,'fields terminated by  '||'"'||','||'"');
      UTL_FILE.NEW_LINE(vc_filename,0);
      UTL_FILE.PUT_LINE(vc_filename,'trailing nullcols ');
      UTL_FILE.NEW_LINE(vc_filename,0);
      UTL_FILE.PUT_LINE(vc_filename,'(');
      UTL_FILE.NEW_LINE(vc_filename,0);
      select max(COLUMN_ID) into maxnum from dba_tab_cols WHERE OWNER=own AND TABLE_NAME=i.TABLSE_NAME;--定位表最后一个字段
      FOR c IN (select COLUMN_NAME,COLUMN_ID from dba_tab_cols WHERE OWNER=own AND TABLE_NAME=i.TABLSE_NAME order by COLUMN_ID) loop
        if c.COLUMN_ID !=maxnum then
          UTL_FILE.PUT_LINE(vc_filename,c.COLUMN_NAME||',');
          UTL_FILE.NEW_LINE(vc_filename,0);
        else 
          UTL_FILE.PUT_LINE(vc_filename,c.COLUMN_NAME);
          UTL_FILE.NEW_LINE(vc_filename,0);
        end if;
      end loop;
      UTL_FILE.PUT_LINE(vc_filename,')');
      UTL_FILE.FCLOSE(vc_filename);
      end loop;
end;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值