1. 需求
有一用户数据存在于csv文件,因为Apex不允许上传超过44列的数据(在该案例中有90多列),所以需求是把所有列先导入到一个clob字段,然后再用存储过程导出到对应的列。
2.解决方法
1) 创建一个有clob字段的表
CREATE TABLE "TABLE3"
( "CONTENT" CLOB
) ;
|
2)创建一个具有真实列的表
CREATE TABLE "TABLE4"
( "NAME" VARCHAR2(20 BYTE),
"SID" VARCHAR2(20 BYTE)
) ;
|
3) 准备一个csv文件
比如,文件名叫book1.csv,文件格式如下
4) 把csv放到一个目录下
比如/home/oracle/csv
同时,在oracle建立一个directory对象
create or replace directory csv as '/home/oracle/csv' ;
grant read,write on directory csv to user1;
|
5) 写一个存储过程把csv放入clob
create or replace PROCEDURE writecsvintoclob AS
l_max_line_length integer := 32767;
l_buffer varchar2(32767);
l_file UTL_FILE.FILE_TYPE;
l_clob clob;
BEGIN
l_file := utl_file.fopen('CSV', 'book1.csv', 'r', l_max_line_length);
dbms_lob.createtemporary(l_clob, TRUE, DBMS_LOB.session);
loop
begin
utl_file.get_line(l_file, l_buffer);
dbms_lob.append(l_clob, l_buffer||';');
exception
when no_data_found then
exit;
end;
end loop;
insert into table3 (content) values (l_clob);
dbms_lob.freetemporary(l_clob);
UTL_FILE.FCLOSE(l_file);
END writecsvintoclob;
|
6) 写一个子存储过程把varchar放入列 (为把clob放入列做准备)
CREATE OR REPLACE PROCEDURE PUTVARCHARINTOCOL ( P_BUFFER IN VARCHAR2 ) AS l_len number; l_start number := 1; l_end number := 32767; l_amount number:=32767; l_field varchar2(32767); l_buffer varchar2(32767); i number :=1; l_sql varchar2(32767); BEGIN l_buffer := p_buffer || ','; l_len :=length(l_buffer); --dbms_output.put_line('l_len='||l_len);
l_end := instr(l_buffer, ',', l_start);
l_sql := 'insert into table4 (name,sid) values (';
while(l_start<l_len) loop -- dbms_output.put_line('l_start='||l_start||',l_end='||l_end); l_amount := (l_end-l_start); --dbms_output.put_line('l_amount='||l_amount); dbms_lob.read(l_buffer, l_amount, l_start, l_field); dbms_output.put_line('field #'||i||':'||l_field);
l_sql := l_sql || ''''||l_field||''',';
i :=i+1; l_start := l_end+1; l_end := instr(l_buffer, ',', l_start);
end loop; l_sql := substr(l_sql,1,length(l_sql)-1); l_sql := l_sql || ')'; dbms_output.put_line('l_sql='||l_sql);
EXECUTE IMMEDIATE l_sql; END PUTVARCHARINTOCOL;
|
7) 写一个存储过程把clob放入列
create or replace PROCEDURE putCLOBINTOcol AS l_clob clob; l_start number := 1; l_end number := 32767; l_amount number:=32767; l_buffer varchar2(32767); l_len number; i number:=1; BEGIN select content into l_clob from table3;
l_len := dbms_lob.getlength(l_clob); --dbms_output.put_line('l_len='||l_len);
l_end := instr(l_clob, ';', l_start);
while(l_start<l_len) loop --dbms_output.put_line('l_start='||l_start||',l_end='||l_end); l_amount := (l_end-l_start); --dbms_output.put_line('l_amount='||l_amount); dbms_lob.read(l_clob, l_amount, l_start, l_buffer); dbms_output.put_line('Line #'||i||':'||l_buffer);
PUTVARCHARINTOCOL(l_buffer);
i :=i+1; l_start := l_end+1; l_end := instr(l_clob, ';', l_start);
end loop;
END putCLOBINTOcol;
|
3. 注意事项
由于有90多列,可能字符串的长度会超过32767,这需要额外处理。
分享到:
相关推荐
本文将详细介绍如何有效地向Oracle数据库插入Clob大段文本,以及在操作过程中可能遇到的问题与解决方案。 ### 一、理解CLOB类型 CLOB类型是Oracle数据库中用于存储大量文本数据的数据类型,它可以存储最大为4GB的...
### 读取Oracle数据库中CLOB字段的值 在处理Oracle数据库时,经常会遇到需要读取CLOB(Character Large Object)类型字段的情况。CLOB主要用于存储大量的文本数据,如文章、文档等内容。由于CLOB类型的数据量可能...
本文将详细介绍如何在Oracle中实现CLOB字段到字符串类型的转换,并探讨其中的关键技术和注意事项。 #### 一、CLOB概述 1. **定义**: - `CLOB`是Oracle数据库提供的一种特殊的数据类型,用于存储大文本数据。 - ...
在数据库.link连接远程数据库时,经常会遇到无法使用CLOB字段的问题,这是因为CLOB字段在远程数据库中的处理方式与本地数据库不同所导致的。下面将讨论解决dblink_clob字段异常的解决方案。 什么是dblink? DBLink...
在Oracle数据库中读取CLOB字段通常涉及数据库连接、SQL查询、CLOB对象处理以及资源管理等多个环节。上述示例展示了如何在Java中实现这一过程。需要注意的是,在实际应用中还应该考虑更多的异常处理机制,以确保程序...
JDBC读写Oracle的CLOB字段
在 Java 中操作 CLOB 字段需要使用 Oracle 的 JDBC 驱动程序,首先我们需要在 Java 项目中引入 Oracle 的 JDBC 驱动程序,然后使用 Connection 对象连接到 Oracle 数据库,最后使用 PreparedStatement 或 Statement ...
### 运用Java如何存取Oracle中的CLOB类型字段 #### 概述 在数据库操作中,经常会遇到处理大量文本数据的需求,例如存储文章、新闻、文档等。Oracle数据库提供了CLOB(Character Large Object)类型来存储大容量的...
SQL Server 中 Image 类型数据导出到 Oracle 的 CLOB 字段中 在进行数据库迁移或数据交换时,需要将不同数据库管理系统之间的数据类型进行转换。在本文中,我们将讨论如何将 SQL Server 中的 Image 类型数据导出到 ...
在实际应用中,还可能涉及CLOB字段的写入操作,这通常可以通过`PreparedStatement`的`setClob()`方法实现,将String转换为`Clob`对象(可以使用`OracleConnection`的`createClob()`方法创建)后再设置到SQL语句中。...
Oracle CLOB 行字段全文检索实现方法 Oracle 数据库中,CLOB 行字段是一种常用的数据类型,用于存储大文本数据。然而,在 Oracle8i 版本之前,对大字段 CLOB 仍然不支持在 where 子句直接的 Like 操作。这使得...
java读取oracle数据库中clob字段 把oracle数据库中字段类型为clob的字段值以字符串的形式读取出来
在探讨“数据库中CLOB类型转换的问题”这一主题时,我们首先需要理解CLOB(Character Large Object)数据类型的基本概念及其在数据库中的应用场景。随后,将深入分析CLOB类型转换过程中可能遇到的问题,并提供相应的...
在Oracle数据库中,CLOB(Character Large Object)字段类型用于存储大量的文本数据,如XML文档、长篇文章或者大量字符数据。然而,当你尝试向CLOB字段插入数据时,如果超过了Oracle规定的最大限制,就会遇到“ORA-...
在数据库迁移或数据同步的过程中,有时需要将含有大对象(LOB,包括BLOB和CLOB)的数据从一个数据库系统复制到另一个不完全支持LOB的数据库系统。本例中,我们讨论如何将DB2数据库中的BLOB数据类型复制到Oracle...
本教程将介绍如何使用Java来读取和写入Oracle数据库中的CLOB字段。 首先,我们需要引入相关的Java和Oracle JDBC驱动库。在上述代码中,我们看到`import oracle.jdbc.driver.OracleDriver;`,这表示我们将使用Oracle...
在数据库管理领域,MySQL和Oracle都是广泛使用的数据库系统,它们在处理特定数据类型时有各自的特点和策略。本文将深入探讨这两个数据库系统如何处理`CLOB`(Character Large Object)和`BLOB`(Binary Large Object...
Oracle如何插入CLOB字段值,附件为简单的示例代码。Oracle如何插入CLOB字段值,附件为简单的示例代码。