客户的业务涉及大量的图片信息,之前这些图片信息只在数据库里存着路径,图片都是存在文件服务器上,现在要做数据库迁移,需要把这些图片都存放到数据库里。
坑爹的是,图片在数据库中的存放路径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;
FILE_PATH字段需要修改
SQL> UPDATE IMAGE SET FILE_PATH=’D:’||EFILE;
SQL> COMMIT;
SQL> SELECT FILE_PATH,IMAGES,EFILE FROM IMAGE;
将此查询结果保存为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;
任务完成。
分享到:
相关推荐
oracle数据库一行拆成多行.sql
oracle 某列存儲的值是有逗號的字符串,希望通過逗號分隔開來顯示多行。sql,有預期結果,有項目實戰。
Oracle 分割字符串 返回多行数据
oracle10g,9i多行合并一行函数
SQL语句用with将列分割成多列存为临时表,再将多行某个字段拼接合并为一行
oracle某个字段多行记录转化为一行,oracle某个字段多行记录转化为一行。
oracle纯SQL语句多行合并一行,中间用“,”隔开,方便快速的显示在页面上
工作和学习中常常会遇到一行要分割成多行数据的情况,在此整理一下做下对比。 单行拆分 如果表数据只有一行,则可以直接在原表上直接使用connect by+正则的方法,比如: select regexp_substr('444.555.666', '[^...
介绍了将多行转为字符串的三种方案,并比较了三种方案的执行效率. 1.sys_connect_by_path + start with ... connect by ... prior + 分析函数 2.自定义Function/SP 3.使用 Oracle 10g 内置函数 wmsys.wm_concat
不做详解,直接上图。 SELECT T.NAME, T.TESTSTR FROM TEST2 T; SELECT DISTINCT T.NAME, REPLACE(REGEXP_SUBSTR(T.TESTSTR, '[^,]+', 1, LEVEL), ',', ' ') TESTSTR FROM TEST2 T WHERE 1 = 1 ...
java调用oracle输出参数为多行多列的结构化数组的存储过程,并将其遍历解析;该demo部署后,只需要配置poolman.xml数据源,即可运行;
比如一个字段'11,22,22,33,44',一个查询语句显示成4行,就可以这样来实现。 11 22 22 33 44
找了网上很多资料,都没有详细的做法有的还很复杂,自己写了个分割函数,通过直接查询就能分割多行,很方便。
Oracle多行记录合并/连接/聚合字符串的几种方法
Oracle插入多行实例,简单介绍了oracle插入多行的实例
在写sql时,经常会有将某列的字段合并起来,比如将某人名下每个月的工资列示,但是每个人只能占一行。 像这种场景,可能用行列转换也能实现,但如果这个月份的信息不固定,就无法使用行列转换了。 oracle10g以后,...
NULL 博文链接:https://czjxdm.iteye.com/blog/466948
Erp/Ehr/Crm/Clm系统的开发者很多时候会用到姓名拆分为汉语拼音的代码。 这个函数可以帮你实现以下内容。 1、返回汉语拼音;例如:张三 需要让函数返回 ZhangSan 或 只需要返回姓氏汉语拼音 Zhang 或 只需返回名字的...
Oracle拆分字符串函数