在Apex把csv导入数据库Clob字段再导入到各自对应列的解决方法

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,文件格式如下


a11,1

b2,2

c33,3

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,这需要额外处理。

时间: 2024-11-05 18:49:17

在Apex把csv导入数据库Clob字段再导入到各自对应列的解决方法的相关文章

mysql 直接从date 文件夹备份表,还原数据库之后提示 table doesn`t exist的原因和解决方法

补充:正常情况下,建议数据库备份最好用工具进行备份,通过拷贝数据库表进行数据迁移,不同的环境会出现各种不同的意外问题. 背景:今天在整理一个网站的时候,操作系统由于系统自动更新导致一直出现系统蓝屏死机,唉,悲剧了,于是重新安装了系统 windows server 2008 enterprise 32bit. 详情: 系统安装完成后,重新配置之前那个网站,appache服务配好之后,再配置数据的时候是这样做的,将原来Mysql 文件夹(C:\Windows.old\ProgramData\MySQ

关于oracle数据库启动报ORA-01122,ORA-01110,ORA-01203错误的解决方法

ORACLE 数据库空间裸设备出问题了,启动oracle失败,解决方法问题现象:     启动ORACLE的时候报如下的错误:        Database mounted.      ORA-01122: database file 6 failed verification check      ORA-01110: data file 6: '/dev/raw/rlv_cbs_user_dat'      ORA-01203: wrong incarnation of this file

【ORACLE】 11g 数据库表导出再导入10g 时空表不能导出的问题

问题:ORACLE 11g 将某用户自带表用 EXP 命令导出再IMP导入 10g 时 发现空表不能到导出 原因:11g 开始建表时,默认不分配 segment ,以节省空间,当表插入第一条数据时,再分配 segment 解决方法3个途径:1:向空白插入一条数据,再删除掉,就分配空间了(空表比较少).2:修改系统参数alter system set deferred_segment_create=false;   (对以后新增的表系统会分配 segment),重启数据库.3:批量对现有的空表分配

oracle数据库出现“批处理中出现错误: ORA-00001: 违反唯一约束条件”解决方法

最近使用oraclede impdp工具全库导入数据库时,在数据库里面使用出现如下情况. SQL state [null]; error code [17081]; 批处理中出现错误: ORA-00001: 违反唯一约束条件 (GDXAORCL.SYS_C0055359) ; nested exception is java.sql.BatchUpdateException: 批处理中出现错误: ORA-00001: 违反唯一约束条件 (GDXAORCL.SYS_C0055359) -(:155

MySQL字段名与保留字冲突的问题及解决方法

问题:MySQL字段名与保留字冲突在实际操作是经常出现的,一把会出现以下错误. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException. 解决方法:在MySQL中,下表中的字显式被保留.其中大多数字进制被标准SQL用作列名和/或表名(例如,GROUP).少数被保留了,因为MySQL需要它们,在MySQL中,当表名或字段名乃至数据库名和保留字冲突时,在sql语句里可以用撇号()括起来,当让我们一般都尽量少使用这些保留的字段. ADD AL

mysql数据库表字段使用DESC等关键字报错及解决方法

<!-- desc是MySQL数据库的关键字,作为字段名直接使用会报错 --> <sql id="Base_Column"> id,mol,ip,port,name,t.desc,maxAc,maxI,minI,maxW,status</sql> <!-- 查询列表 --> <select id="getTht" resultMap="BaseResultMap" parameterType=

【数据库】 Sqlserver 2008 error 40出现连接错误的解决方法

经常要连接到远程数据库上,因此常常碰到这个错误,然后又屡次忘记解决方法,所以今天坐下笔迹,好下次能快速回忆起来. 一.首先检查数据库的TCP/TP是否启动 1.启动Sql server配置管理器 2.开启TCP/IP 二.检查防火墙 如果上面的方法还是不行,则要检查防火墙是否开放1433端口(因为sqlserver默认的Tcp/Ip端口是1433). 首先按照以下路径进入防火墙控制页面: 控制面板 -> 检查防火墙状态 -> 高级设置 然后按照上图所示 1.点击入站规则 2.点击新建规则 然后

VC连接mysql数据库错误:libmysql.lib : fatal error LNK1113: invalid machine 解决方法

VC连接MySQL的配置过程在上一篇博文中,不过当你设置好,以为万事大吉的时候,运行却出现这个错误:libmysql.lib : fatal error LNK1113: invalid machine type. 无效的机器类型,真的是很让人捉急. 发生这个错误的原因是,我在win8.1上安装的是64bit的mysql服务器,而我编译32位的VC程序,连接的是64位的libmysql.lib库,所以会产生 “无效的机器类型(invalid machine type)”的错误提示. 对于这个“e

数据库中的并发操作带来的一系列问题及解决方法

数据库中常见的并发操作所带来的一致性问题包括:丢失的修改.不可重复读.读脏数据.幻影读(幻影读在一些资料中往往与不可重复读归为一类). 丢失修改 下面我们先来看一个例子,说明并发操作带来的数据的不一致性问题. 考虑飞机订票系统中的一个活动序列: 甲售票点(甲事务)读出某航班的机票余额A,设A=16. 乙售票点(乙事务)读出同一航班的机票余额A,也为16. 甲售票点卖出一张机票,修改余额A←A-1.所以A为15,把A写回数据库. 乙售票点也卖出一张机票,修改余额A←A-1.所以A为15,把A写回数