客户的业务涉及大量的图片信息,之前这些图片信息只在数据库里存着路径,图片都是存在文件服务器上,现在要做数据库迁移,需要把这些图片都存放到数据库里。
坑爹的是,图片在数据库中的存放路径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数据库管理中,有时我们需要将一行数据拆分为多行,以便进行更细致的数据处理或分析。本篇文章主要探讨了四种不同的方法来实现这一需求,适用于单行和多行数据的拆分。以下是对这些方法的详细解释: 1. ...
在Oracle数据库中,将逗号分隔的字符串转换为多行是常见的数据处理需求,尤其在需要对每个分隔项进行单独操作时。这个过程通常涉及到字符串处理函数,如`REGEXP_SUBSTR`和`REPLACE`,以及层次查询结构`CONNECT BY`。...
在数据库中,经常会遇到将一个字段中的特殊字符分割的字符串转换成多行数据的情况。这是一个常见的需求,但是网上提供的解决方案往往非常复杂,难以理解和实现。为了解决这个问题,我们可以创建一个字符串分割函数,...
在Oracle数据库中,有时我们需要将多个字段值转换为单个字符串,或者将多行记录合并成一行,这在数据处理和报告生成时尤其常见。Oracle提供了多种方法来实现这一目标,包括使用内置函数、PL/SQL过程以及一些高级特性...
SQL语句用with将列分割成多列存为临时表,再将多行某个字段拼接合并为一行
Oracle管道函数提供了一种高效的方式来处理和转换数据,特别是对于需要将单行数据拆分为多行的情况。这种技术在数据处理、报告生成和ETL(提取、转换、加载)流程中都有广泛的应用。通过使用管道函数,可以减少内存...
Oracle行转列是指在Oracle数据库中将行数据转换为列数据或将列数据转换为行数据的操作。这种操作在实际应用中非常有用,例如,在数据报表、数据分析和数据挖掘等领域都需要使用行转列操作。 1. 列转行 列转行是指...
这样,一行数据被拆分为多行,实现了列转行的效果。 具体的SQL语句如下: ```sql SELECT a.f1, b.fid, DECODE(b.fid, '数据 1', a.qty1, '数据 2', a.qty2, '数据 3', a.qty3) FROM f_distribution a, (SELECT '...
这将把每一列的值拆分为多行,每行包含学生ID、科目名称和对应的分数。 除了PIVOT和UNPIVOT,还可以通过CASE语句和GROUP BY子句实现行列转换。例如,如果我们没有PIVOT功能,也可以这样编写SQL: ```sql SELECT ...
例如,如果我们有一个包含多个产品分类的列,希望将其拆分为多行,可以使用以下方法: ```sql -- 使用CONNECT BY模拟LISTAGG WITH categories (product_id, category_list) AS ( SELECT product_id, replace...
- **多行书写**:SQL语句可以写在一行内,也可以拆分成多行,提高代码的可读性。 - **关键字规则**:关键字不能缩写,且不能跨行。 ### 列头设置与算术运算 #### 列头设置 在SQL\*Plus中,字符和日期类型的列会左...
**解析**: 在Oracle中,可以通过在SELECT语句中加入FOR UPDATE子句来获取表上某一行或多行的排他锁,这样可以阻止其他事务在这段时间内对该数据进行修改。因此,正确答案是B. FOR UPDATE。 #### 十、分区表的管理 - *...
字符串转换成多行通常是指将一个长字符串根据一定的分隔符拆分为多个行。这可以通过Oracle的层次查询来实现。通过层次查询,可以逐个提取字符串中的每个部分,并将其作为独立行输出。 在处理行列互换时,还需注意...
- **拆分分区**: 将现有分区拆分为两个新的分区,适用于第一个分区之前的情况。 - **不能在第一个分区前添加分区**: 由于分区顺序是固定的,因此不能直接在第一个分区之前添加分区。 #### 11. 映射分区 - **题目...
- **解释**:虽然SQL语句本身并不强制要求特定的格式,但为了提高代码的可读性,一般建议将复杂的语句拆分为多行,每个关键字或子句占据一行。 ### 三、SQL语句使用注意事项 **知识点4:DDL与DML的区别** - DDL...
行转列是指将多行数据转换为一行多列的形式。这种转换在汇总或分组数据时特别有用。 **1. AGGREGATE FUNCTION 方法** - **适用版本**: Oracle 8i 及以上 - **操作原理**: 使用 `MAX` 函数(或其他聚合函数)结合...
### B9、带有()子句的SELECT语句可以在表的一行或多行上放置排他锁。 - **FOR UPDATE** 子句可以用于SELECT语句中,以在所选行上设置排他锁。 因此,正确答案为 **B.FOR UPDATE**。 ### C10、使用()命令可以在已...