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

[经验分享] oracle将一行拆分为多行

[复制链接]

尚未签到

发表于 2016-8-10 07:22:27 | 显示全部楼层 |阅读模式
  客户的业务涉及大量的图片信息,之前这些图片信息只在数据库里存着路径,图片都是存在文件服务器上,现在要做数据库迁移,需要把这些图片都存放到数据库里。
坑爹的是,图片在数据库中的存放路径SQL*LOADER不能直接加载,需要进行行记录拆分。
\01\01--0002\04-01-01-0002-003-<0001-0007>.jpg;
\01\01--0003\04-01-01-0003-007-<0001-0003>.jpg;
\01\01--0003\04-01-01-0003-038-<0001-0002>.jpg;
... ...
需要将记录拆分为SQL*LOADER可以加载的格式
\01\01--0002\04-01-01-0002-003-0001.jpg;
\01\01--0002\04-01-01-0002-003-0002.jpg;
\01\01--0002\04-01-01-0002-003-0003.jpg;
\01\01--0002\04-01-01-0002-003-0004.jpg;
\01\01--0002\04-01-01-0002-003-0005.jpg;
\01\01--0002\04-01-01-0002-003-0006.jpg;
\01\01--0002\04-01-01-0002-003-0007.jpg;
\01\01--0003\04-01-01-0003-007-0001.jpg;
\01\01--0003\04-01-01-0003-007-0002.jpg;
\01\01--0003\04-01-01-0003-007-0003.jpg;
\01\01--0003\04-01-01-0003-038-0001.jpg;
\01\01--0003\04-01-01-0003-038-0002.jpg;
本人SQL书写能力较差,勉强写出以下SQL实现该需求。
declare
T_OWNERVOL VARCHAR2(25);
T_KEYWORD VARCHAR2(40);
i integer;
j integer;
v_qian varchar2(100);
v_hou varchar2(200);
  cursor cursor_i is
select substr(TZM, instr(TZM, '<') + 1, 4),substr(TZM, instr(TZM, '>') - 4, 4),substr(TZM, 1, instr(TZM, '<')-1),substr(TZM, instr(TZM, '>')+1, 7),OWNERVOL,KEYWORD from THAMS.LIBFILE722;
begin
  open cursor_i;
  loop
    fetch cursor_i
      into i,j,v_qian,v_hou,T_OWNERVOL,T_KEYWORD;
    exit when cursor_i%NOTFOUND;
    while (j - i >= 0) loop
insert into image(LOB_ID,DOISSER_NUM,DOC_NUM,PIC_NO,EFILE)
values (722,T_OWNERVOL,T_KEYWORD,I+1,v_qian||lpad(i,4,0)||v_hou);
      i := i + 1;
    end loop;
  end loop;
  close cursor_i;
end;
后来经朋友指导,下面的SQL也可实现该需求
with temp1 as(
select rowid my_rowid,regexp_substr(tzm,'<.+>') my_data,
regexp_replace(tzm,'<.+>','<my_replace>') my_replace
from thams.libfile722)
,temp2 as(
select rownum rn from dual
connect by rownum <=50
)
,temp3 as(
select my_rowid,replace(my_replace,'<my_replace>',lpad(regexp_substr(my_data,'[0-9]+')+rn-1,4,'0')) as chaifen
from temp1 a,temp2
where regexp_substr(my_data,'[0-9]+',1,2)-regexp_substr(my_data,'[0-9]+')+1>=rn order by chaifen
)
select a.*,b.chaifen from thams.libfile722 a,temp3 b
where a.rowid=b.my_rowid
查看image表插入的数据
SQL> SELECT FILE_PATH,IMAGES,EFILE FROM IMAGE;
DSC0000.jpg
  FILE_PATH字段需要修改
SQL> UPDATE IMAGE SET FILE_PATH=’D:’||EFILE;
SQL> COMMIT;
SQL> SELECT FILE_PATH,IMAGES,EFILE FROM IMAGE;
DSC0001.jpg
  将此查询结果保存为D:\TEST\421.csv,并在D:\TEST文件夹下建立421.ctl文件,内容如下:
LOAD DATA
INFILE 'd:\test\421.csv'
INTO TABLE images
append
FIELDS TERMINATED BY ','
(DOISSER_NUM,
DOC_NUM,
EFILE,
file_path,
IMAGES lobfile(file_path) TERMINATED BY EOF)
将图片拷贝到FILE_PATH字段的位置,执行SQL*LOADER加载图片到数据库
sqlldr stream/stream control=d:\test\421.ctl log=d:\test\421.log
加载完成查看数据库中的图片信息
SQL> SELECT FILE_PATH,IMAGES,EFILE FROM IMAGE;
DSC0002.jpg
  任务完成。

运维网声明 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-255617-1-1.html 上篇帖子: oracle 的 CONNECT BY 和START WITH 下篇帖子: oracle中删除属于主键的字段
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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