新闻资讯  快讯  焦点  财经  政策  社会
互 联 网   电商  金融  数据  计算  技巧
生活百科  科技  职场  健康  法律  汽车
手机百科  知识  软件  修理  测评  微信
软件技术  应用  系统  图像  视频  经验
硬件技术  知识  技术  测评  选购  维修
网络技术  硬件  软件  设置  安全  技术
程序开发  语言  移动  数据  开源  百科
安全防护  资讯  黑客  木马  病毒  移动
站长技术  搜索  SEO  推广  媒体  移动
财经百科  股票  知识  理财  财务  金融
教育考试  育儿  小学  高考  考研  留学
您当前的位置:首页 > IT百科 > 数据库 > Oracle

向oracle中导入*.csv文件

时间:2019-07-11 09:25:25  来源:  作者:

1.什么是*.csv,如何得到?

里面存放的是数据表.每行代表数据库表格的一行,

每行中,每两个数据中间由逗号","分割.

*.csv可以通过"将excel文件另存为*.csv"得到.

2.如何将*.csv格式的数据导入oracle数据库?

举例来说:

test.csv文件中存放以下数据.

a1,b1

a2,b2

存放路径为:

d: est.csv

准备将其存放到oracle数据库中.

a.首先,则需要新建表(栏位数量和类型要和需要导入的一致)

create table test(A char,B char);

b.新建test.ctl文件

用记事本编辑写入:

load data

infile ‘d: est.csv’

into table “test”

fields terminated by ‘,’

(A,B)

c.打开cmd命令行界面

输入:

sqlldr userid=user/password@database control=d: est.ctl log=d: est.log

回车

user/password@database:为账号和密码以及数据库名称.

以上的介绍比较简单.

http://www.blogJAVA.net/Unmi/archive/2009/01/05/249956.html

里面的介绍比较详细,我转到这里:

关于 Oracle 的数据导入导出及 Sql Loader (sqlldr) 的用法

在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法:

1. A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中

2. 建立数据库间的 dblink,然后用 create table B as select * from A@dblink where ...,或 insert into B select * from A@dblink where ...

3. exp A 表,再 imp 到 B 表,exp 时可加查询条件

4. 程序实现 select from A ..,然后 insert into B ...,也要分批提交

5. 再就是本篇要说到的 Sql Loader(sqlldr) 来导入数据,效果比起逐条 insert 来很明显

第 1 种方法在记录多时是个噩梦,需三五百条的分批提交,否则客户端会死掉,而且导入过程很慢。如果要不产生 REDO 来提高 insert into 的性能,就要下面那样做:

1 alter table B nologging;

2

3 insert /* +AppEND */ into B(c1,c2) values(x,xx);

4 insert /* +APPEND */ into B select * from A@dblink where .....;

5

好啦,前面简述了 Oracle 中数据导入导出的各种方法,我想一定还有更高明的。下面重点讲讲 Oracle 的 Sql Loader (sqlldr) 的用法。

在命令行下执行 Oracle 的 sqlldr 命令,可以看到它的详细参数说明,要着重关注以下几个参数:

userid -- Oracle 的 username/password[@servicename]

control -- 控制文件,可能包含表的数据

-------------------------------------------------------------------------------------------------------

log -- 记录导入时的日志文件,默认为 控制文件(去除扩展名).log

bad -- 坏数据文件,默认为 控制文件(去除扩展名).bad

data -- 数据文件,一般在控制文件中指定。用参数控制文件中不指定数据文件更适于自动操作

errors -- 允许的错误记录数,可以用他来控制一条记录都不能错

rows -- 多少条记录提交一次,默认为 64

skip -- 跳过的行数,比如导出的数据文件前面几行是表头或其他描述

还有更多的 sqlldr 的参数说明请参考:sql loader的用法。

用例子来演示 sqlldr 的使用,有两种使用方法:

1. 只使用一个控制文件,在这个控制文件中包含数据

2. 使用一个控制文件(作为模板) 和一个数据文件

一般为了利于模板和数据的分离,以及程序的不同分工会使用第二种方式,所以先来看这种用法。数据文件可以是 CSV 文件或者以其他分割符分隔的,数据文件可以用 PL/SQL Developer 或者 Toad 导出,也可以用 SQL *Plus 的 spool 格式化产出,或是 UTL_FILE 包生成。另外,用 Toad 还能直接生成包含数据的控制文件。

首先,假定有这么一个表 users,并插入五条记录:

insert into users values(1,'Unmi',3,sysdate);

insert into users values(2,NULL,5,to_date('2008-10-15','YYYY-MM-DD'));

insert into users values(3,'隔叶黄莺',8,to_date('2009-01-02','YYYY-MM-DD'));

insert into users values(4,'Kypfos',NULL,NULL);

insert into users values(5,'不知秋',1,to_date('2008-12-23','YYYY-MM-DD'));

第二种方式: 使用一个控制文件(作为模板) 和一个数据文件

1) 建立数据文件,我们这里用 PL/SQL Developer 导出表 users 的记录为 users_data.csv 文件,内容如下:

" ","USER_ID","USER_NAME","LOGIN_TIMES","LAST_LOGIN"

"1","1","Unmi","3","2009-1-5 20:34:44"

"2","2","","5","2008-10-15"

"3","3","隔叶黄莺","8","2009-1-2"

"4","4","Kypfos","",""

"5","5","不知秋","1","2008-12-23"

2) 建立一个控制文件 users.ctl,内容如下:

说明:在操作类型 truncate 位置可用以下中的一值:

1) insert --为缺省方式,在数据装载开始时要求表为空

2) append --在表中追加新记录

3) replace --删除旧记录(用 delete from table 语句),替换成新装载的记录

4) truncate --删除旧记录(用 truncate table 语句),替换成新装载的记录

3) 执行命令:

sqlldr dbuser/dbpass@dbservice control=users.ctl

在 dbservice 指示的数据库的表 users 中记录就和数据文件中的一样了。

执行完 sqlldr 后希望能留意一下生成的几个文件,如 users.log 日志文件、users.bad 坏数据文件等。特别是要看看日志文件,从中可让你更好的理解 Sql Loader,里面有对控制文件的解析、列出每个字段的类型、加载记录的统计、出错原因等信息。

第一种方式,只使用一个控制文件在这个控制文件中包含数据

1) 把 users_data.cvs 中的内容补到 users.ctl 中,并以 BEGINDATA 连接,还要把 INFILE "users_data.csv" 改为 INFILE *。同时为了更大化的说明问题,把数据处理了一下。此时,完整的 users.ctl 文件内容是:

OPTIONS (skip=1,rows=128) -- sqlldr 命令显示的选项可以写到这里边来,skip=1 用来跳过数据中的第一行

LOAD DATA

INFILE * -- 因为数据同控制文件在一起,所以用 * 表示

append -- 这里用了 append 来操作,在表 users 中附加记录

INTO TABLE users

when LOGIN_TIMES<>'8' -- 还可以用 when 子句选择导入符合条件的记录

Fields terminated by ","

trailing nullcols

(

virtual_column FILLER, --跳过由 PL/SQL Developer 生成的第一列序号

user_id "user_seq.nextval", --这一列直接取序列的下一值,而不用数据中提供的值

user_name "'Hi '||upper(:user_name)",--,还能用SQL函数或运算对数据进行加工处理

login_times terminated by ",", NULLIF(login_times='NULL') --可为列单独指定分隔符

last_login DATE "YYYY-MM-DD HH24:MI:SS" NULLIF (last_login="NULL") -- 当字段为"NULL"时就是 NULL

)

BEGINDATA --数据从这里开始

,USER_ID,USER_NAME,LOGIN_TIMES,LAST_LOGIN

1,1,Unmi,3,2009-1-5 20:34

2,2,Fantasia,5,2008-10-15

3,3,隔叶黄莺,8,2009-1-2

4,4,Kypfos,NULL,NULL

5,5,不知秋,1,2008-12-23

2) 执行一样的命令:

sqlldr dbuser/dbpass@dbservice control=users.ctl

比如,在控制台会显示这样的信息:

C:>sqlldr dbuser/dbpass@dbservice control=users.ctl

SQL*Loader: Release 9.2.0.1.0 - Production on 星期三 1月 7 22:26:25 2009

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

达到提交点,逻辑记录计数4

达到提交点,逻辑记录计数5

上面的控制文件包含的内容比较复杂(演示目的),请根据注释理解每个参数的意义。还能由此发掘更多用法。

最后说下有关 SQL *Loader 的性能与并发操作

1) ROWS 的默认值为 64,你可以根据实际指定更合适的 ROWS 参数来指定每次提交记录数。(体验过在 PL/SQL Developer 中一次执行几条条以上的 insert 语句的情形吗?)

2)常规导入可以通过使用 INSERT语句来导入数据。Direct导入可以跳过数据库的相关逻辑(DIRECT=TRUE),而直接将数据导入到数据文件中,可以提高导入数据的性能。当然,在很多情况下,不能使用此参数(如果主键重复的话会使索引的状态变成UNUSABLE!)。

3) 通过指定 UNRECOVERABLE选项,可以关闭数据库的日志(是否要 alter table table1 nologging 呢?)。这个选项只能和 direct 一起使用。

4) 对于超大数据文件的导入就要用并发操作了,即同时运行多个导入任务.

sqlldr userid=/ control=result1.ctl direct=true parallel=true

sqlldr userid=/ control=result2.ctl direct=true parallel=true

sqlldr userid=/ control=result2.ctl direct=true parallel=true

当加载大量数据时(大约超过10GB),最好抑制日志的产生:

SQL>ALTER TABLE RESULTXT nologging;

这样不产生REDO LOG,可以提高效率。然后在 CONTROL 文件中 load data 上面加一行:unrecoverable, 此选项必须要与DIRECT共同应用。

在并发操作时,ORACLE声称可以达到每小时处理100GB数据的能力!其实,估计能到 1-10G 就算不错了,开始可用结构 相同的文件,但只有少量数据,成功后开始加载大量数据,这样可以避免时间的浪费。



Tags:oracle   点击:()  评论:()
声明:本站部分内容来自互联网,内容观点仅代表作者本人,如有任何版权侵犯请与我们联系,我们将立即删除。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
概述最近在归档某张大表时因需要重建约束,碰到了个ORA-02298类型的报错,这个问题还算比较常见的,这里整理一下一般的处理方法。 思路产生ORA-02298错误一般是你要插入的表A里,有...【详细内容】
2019-10-08   oracle  点击:(4)  评论:(0)  加入收藏
Oracle 12C中一个重要特性多租户特性被引入。12C之前,数据库实例(Oracle Instance)与数据库之间为多对一或一对一关系,若服务器上同时运行多个Oracle数据库,必须同时运行多个数据库实例,资源耗费非常大。...【详细内容】
2019-09-27   oracle  点击:(3)  评论:(0)  加入收藏
抽空总结一下Oracle 物化视图和物化视图日志的一些概念和相关命令,仅供参考。 一、相关概念物化视图是将查询预先定义在结构中,并手动或者定期刷新将结果存储在物化视图段中,也...【详细内容】
2019-09-26   oracle  点击:(13)  评论:(0)  加入收藏
create table student(name varchar2(30),gj varchar2(20),score number(4,1));insert into student (name, gj, score) values (&#39;李二&#39;, &#39;中国&#39;, 90);i...【详细内容】
2019-09-20   oracle  点击:(12)  评论:(0)  加入收藏
概述今天主要介绍几个sql,可能很多人就收藏一下但很少会去用,所以结合案例来做一下分析,这样就知道在什么场景用了。下面介绍一下案例。1、监控分析从监控发现物理IO读处于比...【详细内容】
2019-09-16   oracle  点击:(12)  评论:(0)  加入收藏
Procedure P_EmployeeAccount( Ri_Ret Out Int,Rv_Msg Out Varchar2) IsRec_Test_2017 Test_2017%Rowtype;type type_tmp is record(A Test_2016.A%type,B Test_2016.B%typ...【详细内容】
2019-09-11   oracle  点击:(5)  评论:(0)  加入收藏
一、MySQL 优点:体积小、速度快、总体拥有成本低,开源;支持多种操作系统;是开源数据库,提供的接口支持多种语言连接操作 ;MySQL的核心程序采用完全的多线程编程。线程是轻量级的进...【详细内容】
2019-08-29   oracle  点击:(35)  评论:(0)  加入收藏
概述在oracle8i以后提供了一个生成不重复的数据的一个函数sys_guid()一共32位,生成的依据主要是时间和机器码,具有世界唯一性,类似于java中的UUID(都是世界唯一的)。 SYS_GUIDSYS...【详细内容】
2019-08-29   oracle  点击:(50)  评论:(0)  加入收藏
概述在ORACLE数据库中,DBA_OBJECTS视图中OBJECT_TYPE为LOB的对象是什么东西呢?其实OBJECT_TYPE为LOB就是大对象(LOB),它指那些用来存储大量数据的数据库字段。Oracle 11gR2 文档:h...【详细内容】
2019-08-28   oracle  点击:(33)  评论:(0)  加入收藏
概述今天主要介绍Oracle一个数据字典:V$SQL_WORKAREA_ACTIVE,下面一起来看看吧~V$SQL_WORKAREA_ACTIVEV$SQL_WORKAREA_ACTIVE contains an instantaneous view of the work ar...【详细内容】
2019-08-27   oracle  点击:(30)  评论:(0)  加入收藏
概述分享一些关于Shared Pool 的脚本,仅供参考。一、 Quick CheckSELECT &#39;You may need to increase the SHARED_POOL_RESERVED_SIZE&#39; Description, &#39;RequestFai...【详细内容】
2019-08-27   oracle  点击:(37)  评论:(0)  加入收藏
-- 表create table test (names varchar2(12),dates date,num number);-- 视图create or replace view vi_test asselect * from test;-- 同义词create or replace synonym...【详细内容】
2019-08-21   oracle  点击:(36)  评论:(0)  加入收藏
查看当前用户的缺省表空间SQL>select username,default_tablespace from user_users;查看当前用户的角色SQL>select * from user_role_privs;查看当前用户的系统权限和表级...【详细内容】
2019-08-21   oracle  点击:(27)  评论:(0)  加入收藏
概述DBMS_ROWID包允许我们使用PL/SQL程序或SQL语句创建rowids和获取rowid的信息。例如可以通过其找到数据对象编号,数据文件编号,包含数据行的数据块编号及数据块中的数据行。...【详细内容】
2019-08-21   oracle  点击:(21)  评论:(0)  加入收藏
概述今天主要整理了4道Oracle 经典面试题,与大家分享学习。下面一起看看详细的介绍吧第一题1、测试数据create table test( id number(10) primary key, type number(10) , t...【详细内容】
2019-08-20   oracle  点击:(22)  评论:(0)  加入收藏
概述最近某台oracle数据库中的归档日志太多了,一天都有几十G的归档日志产生,总是提示归档空间满,导致orcle总是与服务器断开,所以就写了个定期清理Oracle归档日志的脚本,先看下...【详细内容】
2019-08-15   oracle  点击:(54)  评论:(0)  加入收藏
Oracle数据库ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。比...【详细内容】
2019-08-08   oracle  点击:(37)  评论:(0)  加入收藏
概述当你在数据库运行时误删除了控制文件怎么办?很不幸有一次我就有这个情况,虽然是测试环境,这里因为我有事先把控制文件分别备份,所以恢复还是比较简单的。下面简单记录下怎...【详细内容】
2019-08-01   oracle  点击:(41)  评论:(0)  加入收藏
Oracle数据库:Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是...【详细内容】
2019-07-30   oracle  点击:(34)  评论:(0)  加入收藏
概述最近有个需求是需要对Oracle某个用户设置输错密码也不被锁,整体原理是:新建一个profile,设置密码错误次数不限制,然后把用户的概要文件(profile)设置为新建的这个profile,下面...【详细内容】
2019-07-30   oracle  点击:(126)  评论:(0)  加入收藏
推荐资讯
相关文章
栏目更新
栏目热门