暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Linux环境Oracle使用sqlldr导入数据

TNodes 2021-07-19
2619

sqlldr命令参数说明

userid -- ORACLE 用户名/口令          
control -- 控制文件名                  
log -- 记录导入时的日志文件.log               
bad -- 坏数据文件.bad  
data -- 数据文件,一般在控制文件中指定。用参数控制文件中不指定数据文件更适于自动操作
discard -- 废弃文件名
discardmax --允许废弃的文件的数目(默认全部)
load -- 要加载的逻辑记录的数目(全部默认)
errors --允许的错误的数目(默认50)
rows --常规路径绑定数组中或直接路径保存数据间的行数 (常规路径默认64,直接路径默认全部)
bindsize --常规路径绑定数组的大小(默认256000.单位字节)
silent --运行过程中隐藏消息(标题,反馈,错误,废弃,分区)
direct --使用直接路径(默认FALSE)
parfile --参数文件:包含参数说明的文件的名称
parallel --执行并行加载(默认FALSE)
file --要从以下对象中分配区的文件
skip_unusable_indexes --不允许/允许使用无用的索引(默认FALSE)
skip_index_maintenance --不维护索引,将受到影响的索引标记为失效(默认FALSE)
commit_discontinued --提交加载中断时已加载的行(默认FALSE)
readsize --读取缓冲区的大小(默认1048576)
external_table --使用外部表进行加栽:NOT_USED,GENERATE_ONLY,EXECUTE (默认NOT_USED)
columnarrayrows --直接路径列数组的行数(默认5000)
streamsize --直接路径流缓冲区的大小(默认256000,单位字节)
multithreading --在直接路径中使用多线程
resumable --启用或禁用当前的可恢复会话(默认FALSE)
resumable_name --有助于标识可恢复语句的文本字符串
resumable_timeout --RESUMABLE 的等待时间(以秒计)(默认7200)
date_cache --日期转换高速缓存的大小(以条目计)(默认1000)

INSERT --向表中插入数据,表必须为空,默认就是INSERT参数
APPEND --向表中追加数据
REPLACE --替换表中数据,相当于先DELETE表中全部数据,然后再INSERT
TRUNCATE --类似REPLACE,通过TRUNCATE的方式删除,然后再INSERT
Oracle数据库sqlldr脚本
#!/bin/bash
#先生成示例文件demo.ctl
#再用sqlloader导数据
ORACLE_HOME=/app/oracle/oracleclient
export ORACLE_HOME
PATH=$PATH:$ORACLE_HOME/bin
export PATH
echo "----开始执行loaddemo.sh文件----"
echo "----开始生成demo.ctl文件----"
echo "参数:$1"
echo "参数:$2"
echo "
LOAD DATA
CHARACTERSET AL32UTF8
INFILE '/解析文件路径/$2'
DISCARDFILE '/bad文件生成路径/demo.bad'
INTO TABLE 数据库表名
REPLACE
FIELDS TERMINATED BY '|@|'
trailing nullcols
(表字段1,
表字段2,
表字段3,
表字段4,
表字段5)
" > ctl文件生成路径/demo.ctl
echo "----demo.ctl文件已生成----"
echo "----开始导入demo数据----"
rmsg1=`sqlldr userid=用户名/密码@ip/数据库实例名 control=/ctl文件生成路径/demo.ctl log=/log文件生成路径/demo.log`
echo "----导入demo数据完成----"
echo "----loaddemo.sh执行完成----"

MySQL数据库loaddata脚本

# !/bin/bash

datestr=$1
file=$2

load_data_log=log文件生成路径/demo.log
load_sql="LOAD DATA LOCAL INFILE '/解析文件路径/${datestr}/${file}'
  INTO TABLE 数据库表名称
  CHARACTER SET gbk
  FIELDS TERMINATED BY '|@|'
      OPTIONALLY ENCLOSED BY ''
  LINES TERMINATED BY '|+|\n'"
mysql -root -p'root' -h127.0.0.1 -P3600 -vv --local-infile=1 << EOF >${load_data_log}

use root;

$load_sql;

exit

EOF

echo "$?"

exit

Java调用shell脚本方法

public class JavaShellUtil {

private final static Log log = LogFactory.getLog(JavaShellUtil.class);

public int importData(String path_sh, String tranDate, String fileName) {
    int status = 0;
    try {
            log.info("执行shell: " + path_sh);
            String[] path = new String[] { "sh", path_sh, tranDate, fileName };
            Process pro = Runtime.getRuntime().exec(path);
            status = pro.waitFor();
            if (status != 0) {
                log.info("Failed to call shell's command");
                throw new Exception(path_sh + " shell脚本运行出错!");
            }
            BufferedReader br = new BufferedReader(new InputStreamReader(
                pro.getInputStream(),"utf-8"));
            StringBuffer sb = new StringBuffer();
            String line;
            while ((line = br.readLine()) != null) {
                sb.append(line).append("\n");
            }
            String result = sb.toString();
            log.info("result:" + result);
        } catch (Exception e) {
               // TODO: handle exception
                log.info("数据加载失败");
                e.printStackTrace();
                return status;
        }
        log.info("数据加载成功");
        return status;
    }
}


 — End —

文章转载自TNodes,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论