oracle sqlldr上传函数应用

最近在使用SQLLDR解析上传的时候遇到问题-多个不同文件汇总到一个表中,其中有多个数据关联,要使用到自定义函数,且关联的多个字段计算后只保存结果,网上很多资料都没有找到合适的例子,相信很多童鞋有过类似的经历。自己摸索后特发一帖一解百优,希望对大家有帮助,上例子!

 

直接贴出这段生成的JAVA代码:

 

StringBuilder sb = new StringBuilder();

                                //从0行读取

sb.append("Options (Skip=0) \n");  

sb.append("LOAD DATA\r\n ");

                                //设置数据库存储字符编码

sb.append("CHARACTERSET ZHS16GBK  \r\n");

                                //读取映射文件路径及名称

sb.append("INFILE '"+ txtFilePath + "infos"+".dat' \r\n");

//这里是用APPEND 会直接插入到数据库中原先的数据不会动

                                sb.append("APPEND\r\n "); 

                                数据库表名

sb.append("INTO TABLE p_table"+"\r\n ");

sb.append("TRAILING NULLCOLS\r\n ");

sb.append("(\r\n ");

//插入1表中的数据  此表使用sequences自动增长 使用自定义函数获得主键ID增长量,其实也可以直接写sequences常量

sb.append("ID    \"getInfoseq()\",\r\n ");

                                //使用CONSTANT 直接插入传入过来的bizDate值,数据库直接保存bizDate

sb.append("BIZ_DATE    CONSTANT '"+bizDate+"',\r\n ");

                                //POSITION是取文件中的字符166-173使用GBK的编码不需要考虑中文占位问题,如果是中文的话直接会按两位来读取,其余的编码可能需要转码

sb.append("col    POSITION(166:173),\r\n ");

sb.append("time  POSITION(157:164) \"to_date(:time,'yyyymmdd')\",\r\n ");

sb.append("A    POSITION(73:87),\r\n ");

                                //这里自定义函数使用了A,T字段

sb.append("T    POSITION(43:46) \"replacetrnc(:T,:A)\",\r\n ");

//插入3表中的数据  使用两个函数计算

sb.append("money    POSITION(485:492) \"nvl(getmoney(:money),0)\",\r\n");

//插入4表中的数据

sb.append("CORT    POSITION(890:894) \"getcort1(:CORT)\",\r\n ");

sb.append("COAM    \"getCoam(nvl(getmoney(:FARE),0),getcort1(:CORT))\",\r\n ");

sb.append("CORT_2    POSITION(912:916) \"getcort2(:CORT_2)\",\r\n ");

                                //这里自定义函数需要注意,我需要的是money这个字段函数转后的值所以要嵌套函数转换

sb.append("COAM_2    POSITION(917:927) \"getCoam(nvl(getmoney(:money),0),getcort2(:CORT_2))\",\r\n ");

sb.append(") ");

 

分享也差不多,不知道大家有没明白,也就是存入数据的数据要使用to_Date  to_number 等函数的时候,可以直接接在当前字段后面 并不需要先插入某个值后在转

 例如数据的字段标示是  time :20121201 1-8位字符 但是我存入后的字段是DATE

可以直接这样写  date postion(1,8) "to_date(:date,'yyyymmdd')"  这里比原来的

time   postion(1,8);

date  "to_date(:date,'yyyymmdd')"  ; 

 

 节省了一个字段,减少表空间冗余。

 

顺便分享下网上找来的资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值