文章资料-情感.机器.认知-电子AI 游客
将Oracle中的数据抽取导出成SQL脚本的方法
【85871】by1 2019-03-22 最后编辑2019-03-22 09:28:38 浏览3217

尝试了很多办法,都不好用

Oracle使用sqluldr2

 sqluldr2简介与使用

sqluldr2是一款Oracle数据快速导出工具,包含32、64位程序,sqluldr2在大数据量导出方面速度超快,能导出亿级数据为excel文件,另外它的导入速度也是非常快速,功能是将数据以TXT/CSV等格式导出。20181101150027766.png

  sqluldr2下载地址:http://www.pc6.com/softview/SoftView_516318.html

  下载完sqluldr解压后,文件夹内容如下:

  sqluldr2.exe  用于32位windows平台;

  sqluldr2_linux32_10204.bin  适用于linux32位操作系统;

  sqluldr2_linux64_10204.bin  适用于linux64位操作系统;

  sqluldr264.exe   用于64位windows平台。

使用方法

1、首先将sqluldr2.exe复制到执行目录下,即可开始使用

2、查看help 帮助

3、执行数据导出命令

  3.1、常规导出 

sqluldr2 hr/hr123@127.0.0.1:1521/XE query="select * from bb_user_t" head=yes file=D:\sqluldr2\File\tmp001.csv

  说明:head=yes   表示输出表头

  3.2、使用sql参数

sqluldr2 hr/hr123@127.0.0.1:1521/XE sql=query.sql head=yes file=D:\sqluldr2\File\tmp002.csv

  或

sqluldr2 hr/hr123@127.0.0.1:1521/XE sql=D:\sqluldr2\query.sql head=yes file=D:\sqluldr2\File\tmp002.csv

  query.sql的内容为:

select * from bb_user_t

3.4、大数据量操作

  对于大表可以输出到多个文件中,指定行数分割或者按照文件大小分割,例如:

 . sqlldr的使用,常见异常

安装ORACLE客户端中有SQLLDR命令

  我的sqlldr位置:C:\oraclexe\app\oracle\product\10.2.0\server\BIN\sqlldr.exe


  注:导入数据字段,表中必须包含(>=)导入数据中字段;

导入数据时遇到的问题:

  异常1:SQL*Loader-522:  文件(temp_004_sqlldr.log)的lfiopn失败

  异常2:SQL*Loader-350:  语法错误位于第 15 行。

  异常3:SQL*Loader-601:  对于 INSERT 选项, 表必须为空。表 BB_USER_T 上出错

  异常4:SQL*Loader-941:  在描述表 BB_USER_T_1 时出错

  SQL*Loader-522:  文件(temp_004_sqlldr.log)的lfiopn失败

原因可能两种

  1.路径和文件名 不正确或不存在

  2.权限不足

解决:将C:\oraclexe\app\oracle\product\10.2.0\server\BIN\sqlldr.exe的sqlldr.exe粘贴到temp_004_sqlldr.ctl文件的目录下,继续执行;

连接数据的方法:
        本地连接方式:
 ./sqluldr2linux64.bin user=gltest/gltest query="select * from T_H_BK_CUSTOMER_20180114_0;" file=/home/oracle/sqluldr2/T_H_BK_CUSTOMER_20180114_0.csv

       客户端连接:TNS方式
 ./sqluldr2linux64.bin user=gltest/gltest@orcl query="select * from T_H_BK_CUSTOMER_20180114_0;" file=/home/oracle/sqluldr2/T_H_BK_CUSTOMER_20180114_0.csv

      客户端连接:直接连接方式
 ./sqluldr2linux64.bin user=gltest/gltest@192.168.128.98:1521/orcl query="select * from T_H_BK_CUSTOMER_20180114_0;" file=/home/oracle/sqluldr2/T_H_BK_CUSTOMER_20180114_0.csv

  1. 1. 导出文件里有中文显示乱码,需要设置参数charset=UTF8
         2. ORA-24345: A Truncation or null fetch error occurred,设置参数safe=yes

  这个so文件,在安装oracle后,肯定是有的,如果没有可以用软连接 ln -s xxxx  libclntsh.so.10.1

1.下面只需配置 LD_LIBRARY_PATH

export ORACLE_HOME=/u01/app/Oracle/product/11.2.0/dbhome_1
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH
export PATH=$PATH:$ORACLE_HOME:$ORACLE_HOME/bin

2.source /etc/profile

Oracle提供了高效的文本装载工具(sqlldr)来装载格式化文本文件(如CSV文件)里的数据到Oracle中,却不提供一个文本导出工具来做不同数据库之间的数据交换。特别是在各种大数据技术(Hadoop/Greenplum等)兴起的年代,文件文件是最好的数据交搞方式,看来是必须得自己写程序或脚本来做这个工具了。SQLULDR2就是为此目的而用OCI接口编写的高效工具,并且已经被全世界的Oracle DBA使用超过10年了。

Oracle占据了绝大部份传统应用,而MySQL则占据了新应用领域,一般来讲DBA需要同时管理和操作这两种数据库了,因此会从Oracle和MySQL中导出数据进行交换。为了少记几个参数,又编写了MySQLULDR2来支持MySQL数据库,这两个工具有相同的命令行参数(以后也许会整合成一个),以方便大家使用。

sqluldr2没有输出

这个得用PL/SQL DEV这个工具才行。
1、打开PL/SQL DEV,然中要进行导出的表,点击右键,在弹出的菜单中,选中Export data(如下图所示)。单击Export data后,在右侧就出现了导出设置的窗口,如下图所示:
 图二
在窗口下方,选中SQL Inserts标签页,设置导出条件。
3、设置完成后,点击Export按钮,即可导出。 

这个工具不能指定多个sql语句导出

文本文件用sqlldr工具导入到oracel数据库中


1.文本文件student数据如下
1001,李三,90
1002,王五,87
1002,李四,86

2.在oracle数据库中scott用户创建表student表
create table student (id int ,name varchar2(20),grade int);

.编写sqlldr控制文件student.ctl
load data
infile 'e:\student.txt'
into table student
fields terminated by ','
(
id,
name,
grade
)

4.导入数据
C:\>sqlldr scott/tiger control=e:\student.ctl log=e:\log.log

select 

         'INSERT INTO B_STATTEMPLATE ( N_ID,C_NAME, C_KBH, N_PRINT, N_TYPE, N_APP, N_VALID ) '

         || 'Values (' || To_Char(N_ID) ||',''' || C_NAME || ''', ''' || C_KBH || ''', ' 

         || To_Char( N_PRINT ) || ', ' || To_Char( N_TYPE ) || ', ' || '0, 0 );'

 from b_stattemplate

qluldr2 执行后既不报错也不打印日志

.去掉环境变量NLS_LANG;

2.在执行语句前加上unset NLS_LANG;

环境变量本来就NLS_LANG 没有,不起作用

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

(1)ROWS的默认值为64,你可以根据实际指定更合适的ROWS参数来指定每次提交记录数。

(2)常规导入可以通过使用INSERT语句来导入数据。Direct导入可以啵过数据库的相关逻辑(DIRECT=TRUE),而直接将数据导入到数据文件中,可以提高导入数据的性能。当然,在很多情况下,不能使用此参数。

(3)通过指UNRECOVERABLE选项,可以关闭数据库的日志,这个选项必须与direct一起使用。

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

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

使用sqluldr2在oracle bin目录下执行后,没有任何效果,没有日志也没有数据。是在/etc/profile  或者.bash_profile 文件中配置了 NLS_LANG的问题,注释掉或者换一个值试试看背景是需要把ORACLE中的历史数据导出做数据备份存储,由于ORACLE配置的字符集是AMERICAN.AMERICA_WE8ISO8859P1,

 oracle NLS_LANG环境变量设置

select parameter, value from nls_database_parameters;
查询以下三个参数值:
NLS_LANGUAGE SIMPLIFIED CHINESE
NLS_TERRITORY CHINA
NLS_CHARACTERSET AL32UTF8

查询NLS_LANG的组成规则为NLS_LANGUAGE_NLS_TERRITORY.NLS_CHARACTERSET

export NLS_LANG='SIMPLIFIED CHINESE_CHINA.AL32UTF8'