2025年sqlldr 导入(sqlldr 导入数据有换行符)

sqlldr 导入(sqlldr 导入数据有换行符)一 基本知识 Oracle 的 nbsp SQL LOADER nbsp 可以将外部格式化的文本数据加载到数据库表中 通常 与 SPOOL 导出文本数据方法配合使用 1 命令格式 SQLLDR keyword value keyword value 例 sqlldr user pwd

大家好,我是讯享网,很高兴认识大家。



  一、基本知识

  Oracle 的  SQL* LOADER  可以将外部格式化的文本数据加载到数据库表中。通常 与 SPOOL导出文本数据方法配合使用。

  1、命令格式

  SQLLDR keyword=value [,keyword=value,……]

  例:\( sqlldr user/pwd control=emp.ctl data=emp.dat bad=emp.bad log=emp.log</p><p><strong>  2、控制文件</strong></p><p>  SQL*LOADER&nbsp; 根据控制文件可以找到需要加载的数据。并且分析和解释这些数据。</p><p>  控制文件由三个部分组成,具体参数参考帮助文档:1.&nbsp; 全局选件,行,跳过的记录数等;2. INFILE 子句指定的输入数据;3.&nbsp; 数据特性说明。</p><p>  comment: &mdash;&mdash;注释</p><p>  例:</p><p>  load data infile *</p><p>  append&nbsp;&nbsp;&nbsp; &mdash;&mdash;除了 append外,还有 insert、replace、truncate等方式</p><p>  into table emp fields terminated b y &lsquo;|&rsquo;</p><p>  (</p><p>  no&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float external, name char(20),</p><p>  age&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; integer external,</p><p>  duty&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char(1),salary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; float external,</p><p>  upd_ts&nbsp;&nbsp;&nbsp;&nbsp; date(14) &lsquo;YYYYMMDDHH24MISS&rsquo;)</p><p>  begindata</p><p>  3|Mulder|000020|1|000000005000|000</p><p>  4|Scully|000025|2|000000008000|959</p><p>  控制文件中infile选项跟sqlldr 命令行中data 选项含义相同,如使用infile *则表明数据在本控制文件以 begin data 开头的区域内。 一些选项:FIELDS TERMINATED BY WHITESPACE FIELDS TERMINATED BY x'09' FILLER_1 FILLER, //&nbsp; 指定某一列将不会被装载</p><p>  DEPTNO position(1:2), DNAME position(*:16), //&nbsp; 指定列的位置SEQNO RECNUM //载入每行的行号</p><p>  SKIP n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; 指定导入时可以跳过多少行数据</p><p><strong>  3、数据文件</strong></p><p>  按控制文件数据格式定义的数据行集,</p><p>  例:</p><p>  1|Tom|000020|1|000000005000|000</p><p>  2|Jerry|000025|2|000000008000|959</p><p>  固定格式、可变格式、流记录格式:</p><p>  固定格式:</p><p>  当数据固定的格式(长度一样)时且是在文件中得到时,要用 INFILE &quot;fix n&quot;</p><p>  load data</p><p>  infile 'example.dat' &quot;fix 11&quot;</p><p>  into table example</p><p>  fields terminated b y ',' optionally enclosed by '&quot;'</p><p>  (col1 char(5), col2 char(7)) example.dat:</p><p>  001, cd, 0002,fghi,</p><p>  00003,lmn,</p><p>  1, &quot;pqrs&quot;,</p><p>  0005,uvwx,</p><p>  可变格式:</p><p>  当数据是可变格式(长度不一样)时且是在文件中得到时,要用 INFILE &quot;var n&quot;.如:</p><p>  load data</p><p>  infile 'example.dat' &quot;var 3&quot;</p><p>  into table example</p><p>  fields terminated b y ',' optionally enclosed by '&quot;'</p><p>  (col1 char(5), col2 char(7)) example.dat:</p><p>  009hello,cd,010world,im,</p><p>  012my,name is,</p><p>  流记录格式: // Stream-recored format:load data infile 'xx.dat' &quot;str '| '&quot;</p><p>  into table xx field terminated b y ',' optionally enclosed by '&quot;'</p><p>  (col1 char(5), col2 char(7))</p><p>  example.dat:</p><p>  hello, ccd,|</p><p>  world, bb,|</p><p><strong>  4、坏文件</strong></p><p>  bad=emp.bad坏文件包含那些被 SQL*Loader拒绝的记录。被拒绝的记录可能是不符合要求的记录。</p><p><strong>  5、日志文件及日志信息</strong></p><p>  log=emp.log当 SQL*Loader&nbsp; 开始执行后,它就自动建立&nbsp; 日志文件。日志文件包含有加载的总 结,加载中的错误信息等。</p><p></p><p><strong>  二、高级选项</strong></p><p>  <strong>1、Conventional Path Load与Direct Path Load</strong></p><p>  Conventional-path Load:通过常规通道方式上载。</p><p>  特点:commit, always&nbsp; gen redo logs,&nbsp; enforce all constraints, fire insert triggers, can load into cluster, other user can make change</p><p>  rows:每次提交的记录数</p><p>  bindsize:每次提交记录的缓冲区</p><p>  readsize:与 bindsize 成对使用,其中较小者会自动调整到较大者</p><p>  sqlldr 先计算单条记录长度,乘以 rows,如小于 bindsize,不会试图扩张,rows以填充 bindsize;如超出,则以 bindsize 为准。 命令为:</p><p>  \) sqlldr dbuser/oracle control=emp.ctl log=emp.log rows=10000 bindsize=

  Direct-Path Load:

  通过直通方式上载,可以跳过数据库的相关逻辑,不进行&nbsp; SQL解析,而直接将数 据导入到数据文件中。


讯享网

  特点:save, conditionly gen redo logs, enforce PK UK NN, not fire triggers, can not load into cluster, other user can not make change命令为:

  \( sqlldr dbuser/oracle control=emp.ctl log=emp.log direct=true</p><p>  <strong>2、SPOOL导出文本数据方法</strong></p><p>  导入的数据文件可以用 SPOOL导出文本数据方法生成。</p><p>  SQL*PLUS环境设置</p><p>  SET NEWPAGE NONE HEADING OFF SPACE 0</p><p>  PAGESIZE 0 SET TRIMOUT ON TRIMSPOOL ON LINESIZE 2500</p><p>  注:LINESIZE 要稍微设置大些,免得数据被截断,它应和相应的 TRIMSPOOL结合使用防止导出的文本有太多的尾部空格。</p><p>  但是如果 LINESIZE 设置太大,会大大降低导出的速度,另外在 WINDOWS下导 出最好不要用 PLSQL导出,速度比较慢,直接用&nbsp; COMMEND 下的 SQLPLUS命令最 小化窗口执行。对于字段内包含很多回车换行符的应该给与过滤,形成比较规矩的文本 文件。</p><p>  通常情况下,我们使用 SPOOL方法,将数据库中的表导出为文本文件,如下述:</p><p>  set trimspool on</p><p>  set linesize 120 pagesize 2000 newpage 1 heading off&nbsp;&nbsp;&nbsp; term off spool&nbsp; 路径+文件名</p><p>  select col1||','||col2||','||col3||','||col4||'&hellip;&hellip;' from tablename;</p><p>  spool off</p><p></p><p><strong>  三、脚本</strong></p><p>  1<strong>、</strong>将表中数据记录导出为字段值用分隔符'|'分开的。dat文件</p><p>  #!/bin/ksh</p><p>  </p><p>  &nbsp;&nbsp;&nbsp; 名称: unloadtable</p><p>  &nbsp;&nbsp;&nbsp; 功能:&nbsp; 本 shell 用于将表中数据记录导出</p><p>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 导出为字段值用分隔符'|'分开的。dat文件</p><p>  &nbsp;&nbsp;&nbsp; 编者:</p><p>  &nbsp;&nbsp;&nbsp; 日期: 2006.03.18</p><p>&nbsp;&nbsp;&nbsp; </p><p>  if [ \)# -ne 3 ]

  then echo &quot;usage:unloadtable tablename username password.&quot;

  exit 0

  fi

  准备工作

  echo &quot;set heading off&nbsp;&nbsp;&nbsp;&nbsp; &quot; &gt;/tmp/\(1.col</p><p>  echo &quot;set pagesize 0&quot; &gt;&gt;/tmp/\)1.col

  echo &quot;set linesize 800&nbsp;&nbsp;&nbsp; &quot; &gt;&gt;/tmp/\(1.col</p><p>  echo &quot;set feedback off&nbsp;&nbsp;&nbsp; &quot; &gt;&gt;/tmp/\)1.col

  echo &quot;set tab off&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot; &gt;&gt;/tmp/\(1.col</p><p>  echo&nbsp; &quot;select&nbsp; column_name||','&nbsp; from&nbsp; user_tab_columns&nbsp; where&nbsp; lower(table_name)='\)1’&nbsp; order&nbsp; by

  column_id; &quot; &gt;&gt; /tmp/\(1.col</p><p>  产生 select 语句</p><p>  echo &quot;set heading off&nbsp;&nbsp;&nbsp;&nbsp; &quot; &gt;/tmp/\)1.sel

  echo &quot;set pagesize 0&quot; &gt;&gt;/tmp/\(1.sel</p><p>  echo &quot;set linesize 800&nbsp;&nbsp;&nbsp; &quot; &gt;&gt;/tmp/\)1.sel

  echo &quot;set feedback off&nbsp;&nbsp;&nbsp; &quot; &gt;&gt;/tmp/\(1.sel</p><p>  echo &quot;set tab off&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot; &gt;&gt;/tmp/\)1.sel

  echo &quot;select &quot; &gt;&gt;/tmp/\(1.sel</p><p>  echo&nbsp; `sqlplus&nbsp; -s&nbsp; \)2/\(3&nbsp; &lt;&nbsp; /tmp/\)1.col&nbsp; |sed&nbsp; &quot;s/,/||'|'||/g&quot;&nbsp; |sed&nbsp; &quot;s/||$//g&quot;|sed&nbsp; &quot;s/date/&quot;date&quot;/g&quot;</p><p>  &gt;&gt;/tmp/$1.sel</p><p>  生成 dat文件</p><p>  #echo &quot;from $1; /&quot; &gt;&gt;/tmp/$1.sel&nbsp;&nbsp;&nbsp; 由于&nbsp; /&nbsp; 导致多执行一次 select</p><p>  echo &quot;from $1; &quot; &gt;&gt;/tmp/$1.sel</p><p>  sqlplus -s $2/$3 &lt; /tmp/$1.sel &gt;$1_tmp.dat</p><p>  #awk '{if(FNR!=1) print $0}' $1_tmp.dat &gt;$1.dat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FNR 选项使得第一条记录选不出</p><p>  awk '{print $0}' $1_tmp.dat &gt;$1.dat</p><p>  rm -f $1_tmp.dat</p><p>  <strong>2、将数据导入到相应表中</strong></p><p>  #!/bin/ksh</p><p>  </p><p>  &nbsp;&nbsp;&nbsp; 名称:loadtable</p><p>  &nbsp;&nbsp;&nbsp; 功能:本 shell 用于将已经准备好的。dat数据文件导入相应的表中</p><p>  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .dat 文件各个字段值用分隔符'|'分开。</p><p>  &nbsp;&nbsp;&nbsp; 编者:</p><p>  &nbsp;&nbsp;&nbsp; 日期: 2006.03.18</p><p>  </p><p>  if [ $# -ne 3 ]</p><p>  then</p><p>  echo &quot;usage:loadtable tablename username&nbsp;&nbsp;&nbsp; password.&quot; exit 0 fi</p><p>  准备工作</p><p>  echo &quot;set heading off&nbsp;&nbsp;&nbsp;&nbsp; &quot; &gt;/tmp/$1.colsql</p><p>  echo &quot;set pagesize 0&quot; &gt;&gt;/tmp/$1.colsql</p><p>  echo &quot;set linesize 800&nbsp;&nbsp;&nbsp; &quot; &gt;&gt;/tmp/$1.colsql</p><p>  echo &quot;set feedback off&nbsp;&nbsp;&nbsp; &quot; &gt;&gt;/tmp/$1.colsql</p><p>  echo &quot;set tab off&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot; &gt;&gt;/tmp/$1.colsql</p><p>  echo&nbsp; &quot;select&nbsp; column_name||','&nbsp; from&nbsp; user_tab_columns&nbsp; where&nbsp; lower(table_name)='$1'&nbsp; order&nbsp; by</p><p>  column_id; &quot; &gt;&gt; /tmp/$1.colsql</p><p>  产生 ctl文件</p><p>  echo &quot;load data&quot; &gt;/tmp/$1.ctl</p><p>  echo &quot;infile *&quot; &gt;&gt;/tmp/$1.ctl</p><p>  echo &quot;into table $1&quot; &gt;&gt;/tmp/$1.ctl</p><p>  echo &quot;fields terminated by '|'&quot; &gt;&gt;/tmp/$1.ctl</p><p>  echosqlplus -s \(2/\)3 &lt; /tmp/\(1.colsql` |sed &quot;s/,\)/)/g&quot; |sed &quot;s/^/(/g&quot; &gt;&gt;/tmp/\(1.ctl</p><p>  开始导入数据</p><p>  echo &quot;truncate table \)1;&quot; &gt;/tmp/\(1.sql</p><p>  sqlplus \)2/\(3 &lt; /tmp/\)1.sql

  sqlldr \(2/\)3 data=\(1.dat control=/tmp/\)1.ctl log=/tmp/$1.log

小讯
上一篇 2025-05-04 07:57
下一篇 2025-04-28 18:30

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/167796.html