`
luogen33
  • 浏览: 81354 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

oracle的文本导入、导出技巧

阅读更多
在使用oracle时,总觉得oracle的导入,导出没有informix的load,unload好用,没办法,只能参照网上朋友的思路和informix的实现,写了几个脚本,希望各位高手指点:
  
  =============================================
  
  工具用法:
  unload.sh
  Usage: unload.sh userid/passwd[@oraclesid] [tabname]
  注释:
  如果不加’@oraclesid’,则用当前环境变量ORACLE_SID。
  如果不加tabname参数,则处理该用户下的所有表,生成’表名.unl’文件。
  如果加tabname参数,则单独处理该表,生成’表名.unl’文件。
  load.sh
  Usage: load.sh userid/passwd[@oraclesid] [tabname]
  注释:
  如果不加’@oraclesid’,则用当前环境变量ORACLE_SID。
  如果不加tabname参数,则装载该用户下的所有表,必须存在’表名.unl’
  文件。
  如果加tabname参数,则单独处理该表,必须存在’表名.unl’文件。
  
  =============================================
  
  具体实现:
  unload.sh
  利用spool的功能,将表中的数据导出到对应的文本中。
  load.sh
  利用sql*load的功能,将文本中的数据导入到表中。
  控制文件是自动生成的,使用者不需要知道格式
  执行sqlload的脚本也是自动生成
  generate_control_file.sh
  生成控制文件
  generate_execute_shell.sh
  生成执行脚本
  
  =============================================
  代码说明
  load.sh
  #!/usr/bin/ksh
  #########################################
  #
  # 模块: load.sh
  #
  # 描述: 根据一个数据库或表名来装载对应的数据文件
  #
  # 参数 1 = 用户名/密码[@实例名]
  # 参数 2 = 表名(可选)
  #
  # 作者 Bing He
  #
  # 修改记录
  # 日期 修改人 修改描述
  #
  # 09/23/2003 Bing He 开始编写
  #
  ###########################################
  
  lv_temp1="wk.test1"
  
  f_get_tables()
  {
  rm -f ${lv_temp1}
  sqlplus ${userid} </dev/null
  set colsep $sep;
  set echo off;
  set feedback off;
  set heading off;
  set pagesize 0;
  set linesize 1000;
  set numwidth 12;
  set termout off;
  set trimout on;
  set trimspool on;
  spool ${lv_temp1};
  select table_name from user_tables;
  spool off;
  exit
  !
  if [ "$?" -ne 0 ]
  then
  echo "Error:sqlplus ${userid} error in load for ${userid} !"
  echo "please check userid and passwd or oracle_sid."
  exit
  fi
  
  if [ -f ${lv_temp1} ]
  then
  lv_tables=`cat ${lv_temp1} |grep -v "^SQL>" | tr -d ' '`
  else
  echo "Error:${lv_temp1} file not found!"
  exit
  fi
  
  rm -f ${lv_temp1}
  
  }
  
  ######################################
  ## 主程序入口
  
  lv_no=$#
  
  case ${lv_no} in
  1 )
  userid=$1
  f_get_tables;
  ;;
  2 )
  userid=$1
  lv_tables=$2
  ;;
  * )
  echo "Usage: $0 "
  exit
  ;;
  esac
  
  for lv_table in ${lv_tables}
  do
  if [ ! -f ${lv_table}.unl ]
  then
  echo "Error:${lv_table}.unl file not found!"
  else
  generate_control_file.sh ${userid} ${lv_table}
  generate_execute_shell.sh ${userid} ${lv_table}
  sh load_${lv_table}.sh
  rm -f ${lv_table}.ctl
  rm -f load_${lv_table}.sh
  fi
  done
  
  ##########################################  
  unload.sh
  #!/usr/bin/ksh
  #############################################
  #
  # 模块: unload.sh
  #
  # 描述: 根据一个数据库或表名来卸载数据并生成对应的数据文件
  #
  # 参数 1 = 用户名/密码[@实例名]
  # 参数 2 = 表名(可选)
  #
  # 作者 Bing He
  #
  # 修改记录
  # 日期 修改人 修改描述
  #
  # 09/23/2003 Bing He 开始编写
  #
  ##########################################
  
  lv_sep='|' # --分隔符,可以修改成自己想要的分隔符,如'|'
  lv_temp1="unload.temp1"
  
  f_get_tables()
  {
  rm -f ${lv_temp1}
  sqlplus ${userid} </dev/null
  set colsep ${lv_sep};
  set echo off;
  set feedback off;
  set heading off;
  set pagesize 0;
  set linesize 1000;
  set numwidth 12;
  set termout off;
  set trimout on;
  set trimspool on;
  spool ${lv_temp1};
  select table_name from user_tables;
  spool off;
  exit
  !
  if [ "$?" -ne 0 ] ; then
  echo "sqlplus $userid error in get table name <"$?">!!"
  echo "please check userid and passwd or database."
  exit
  fi
  
  if [ -f ${lv_temp1} ]
  then
  lv_tables=`cat ${lv_temp1} |grep -v "^SQL>" | tr -d ' '`
  else
  echo "Error:${lv_temp1} file not found!"
  exit
  fi
  rm -f ${lv_temp1}
  
  }
  
  ########################################
  ## 主程序入口
  lv_no=$#
  
  case ${lv_no} in
  1 )
  userid=$1
  f_get_tables;
  ;;
  2 )
  userid=$1
  lv_tables=$2
  ;;
  * )
  echo "Usage: $0 "
  exit
  ;;
  esac
  
  ##############################
  
  ###############################
  ## 执行下载操作
  
  for table in ${lv_tables}
  do
  rm -f lv_$table.txt
  sqlplus ${userid} </dev/null
  set colsep ${lv_sep};
  set echo off;
  set feedback off;
  set heading off;
  set pagesize 0;
  set linesize 1000;
  set numwidth 12;
  set termout off;
  set trimout on;
  set trimspool on;
  spool lv_$table.txt;
  select * from $table;
  spool off;
  !
  if [ "$?" -ne 0 ]
  then
  echo "error:sqlplus $userid error in unload table $table!!"
  echo "please check userid and passwd or database."
  exit
  fi
  
  if [ -f lv_$table.txt ]
  then
  cat lv_$table.txt | grep -v "^SQL>"|sed -e "s/ *$//g"|sed "s/$/\|/g"|sed -e "s/ *\|/\|/g" >${table}.unl
  if [[ `grep "ORA-" $table.unl` = "" ]]; then
  echo "unload table ${table}....\t\t\t\t\t ok"
  else
  cat ${table}.unl
  err="$err ${table}"
  fi
  else
  echo $0 error
  fi
  rm -f lv_$table.txt
  done
  
  #########################################束操作
  
  if [[ "X$err" = "X" ]];then
  echo "Unload Complete!,Thank you!"
  else
  echo "Unload Table $err error, please check it!"
  fi
  
  ############################################
  
  generate_control_file.sh
  #!/usr/bin/ksh
  ############################################
  #
  # 模块: generate_control_file.sh
  #
  # 描述: 根据一个表名生成该表的控制文件
  #
  # 参数 1 = 用户名/密码[@实例名]
  # 参数 2 = 表名
  #
  # 作者 Bing He
  #
  # 修改记录
  # 日期 修改人 修改描述
  #
  # 09/23/2003 Bing He 开始编写
  #
  ##############################################
  
  ##############################################
  ## 主程序入口
  
  if [ ! $# -eq 2 ]
  then
  echo "Usage: $0 "
  exit
  else
  userid=$1
  table=$2
  fi
  
  ###########################################
  
  ###########################################
  ## 执行下载操作
  
  lv_temp="wk_${table}.test"
  lv_temp1="wk_${table}.test1"
  lv_temp2="wk_${table}.test2"
  lv_control="${table}.ctl"
  
  sqlplus ${userid} </dev/null
  spool ${lv_temp};
  desc ${table}
  spool off;
  exit
  !
  if [ "$?" -ne 0 ]
  then
  echo "Error:sqlplus ${userid} error in generate control file for table ${table} !"
  echo "please check userid and passwd or oracle_sid."
  exit
  fi
  
  if [ -f ${lv_temp} ]
  then
  cat ${lv_temp}|grep -v "^SQL>" |grep -v " Name " |grep -v " -------" |awk '{print $1}' > ${lv_temp1}
  lv_line_num=`cat ${lv_temp1} | wc -l`
  lv_line_num=`expr ${lv_line_num} - 2`
  lv_index=0
  
  rm -f ${lv_temp2}
  for lineinfo in `cat ${lv_temp1}`
  do
  if [ ${lv_index} -eq ${lv_line_num} ]
  then
  echo "${lineinfo}" >> ${lv_temp2}
  else
  echo "${lineinfo}," >> ${lv_temp2}
  lv_index=`expr ${lv_index} + 1`
  fi
  done
  else
  echo "$0 error :not find ${lv_temp} file."
  exit
  fi
  
  lv_str="LOAD DATA INFILE '${table}.unl' BADFILE 'bad_${table}.bad' APPEND INTO TABLE ${table} FIELDS TERMINATEd BY \"|\""
  echo ${lv_str} > ${lv_control}
  echo "(" >> ${lv_control}
  cat ${lv_temp2} >> ${lv_control}
  echo ")" >> ${lv_control}
  
  rm -f ${lv_temp}
  rm -f ${lv_temp1}
  rm -f ${lv_temp2}
  
  #########################################
  
  generate_execute_shell.sh
  #!/usr/bin/ksh
  #########################################
  #
  # 模块: generate_execute_shell.sh
  #
  # 描述: 根据一个表名生成该表的装载脚本
  #
  # 参数 1 = 用户名/密码[@实例名]
  # 参数 2 = 表名
  #
  # 作者 Bing He
  #
  # 修改记录
  # 日期 修改人 修改描述
  #
  # 09/23/2003 Bing He 开始编写
  #
  ########################################
  
  #######################################
  ## 主程序入口
  
  if [ ! $# -eq 2 ]
  then
  echo "Usage: $0 "
  exit
  else
  userid=$1
  table=$2
  fi
  
  ########################################
  
  ########################################
  ## 局部变量定义区域
  
  lv_rows=10000
  lv_bindsize=8192000
  lv_readsize=8192000
  
  #########################################
  
  #########################################
  ## 生成执行脚本文件
  
  echo "sqlldr ${userid} control=${table}.ctl rows=${lv_rows} bindsize=${lv_bindsize} readsize=${lv_readsize} log=log_${table}.log bad=bad_${table}.bad direct=true" > load_${table}.sh
分享到:
评论

相关推荐

    oracle文本导入导出工具-ozoradts

    Import采用直接路径方式,等同于sqlldr的Direct方式导入(DIRECT=TRUE),nolog参数等同于sqldr的UNRECOVERABLE参数 ozoradts -exp userid=test/test@oradb columnover=";" query="select * from fct_serv_product_...

    Oracle导入和导出工具使用

    Oracle导入和导出工具使用

    oracle数据导入导出FTP

    这里提到的"高性能的oracle文本处理器"和"sqlload"是指Oracle的SQL*Loader工具,它是一个高效的数据加载程序,能够快速地将大量数据从文本文件批量导入到Oracle数据库中。 **Oracle SQL*Loader基础** SQL*Loader是...

    Mysql to Oracle导入导出说明

    总的来说,从MySQL到Oracle的数据迁移涉及多个步骤,包括数据导出、转换、导入以及各种兼容性问题的处理。合理选择工具和策略,能有效保证迁移过程的顺利进行。在实际操作中,应结合具体情况进行详细规划和测试,以...

    Oracle数据库导入导出方法

    Oracle数据库的导入导出是数据库管理中常见的操作,主要用于数据迁移、备份恢复或者数据库环境间的同步。Oracle提供了多种工具来实现这一目标,如SQL*Loader、exp和imp等。下面我们将详细探讨这些方法。 首先,SQL*...

    照片批量导入导出

    在IT行业中,照片批量导入导出是一项常见的任务,特别是在数据管理、媒体库建设或网站维护等领域。本场景涉及的关键技术主要是数据库操作、图像处理以及批处理能力。以下将详细阐述这些知识点: 1. **Oracle数据库*...

    数据导入导出两个技巧

    本文将详细介绍两种高效的数据导入导出技巧,特别是在Oracle数据库环境下。 1. **导出DMP增加条件** Oracle的Data Pump(DMP)是一种快速、高效的导出工具,它可以将数据库对象及其数据导出到二进制文件中。当...

    PROC++批量导入导出ORACLE数据库表[借鉴].pdf

    PROC++批量导入导出ORACLE数据库表 本文档主要介绍了使用PROC++批量导入导出ORACLE数据库表的方法。该方法使用C++ Builder 5.5和PROC++语言,实现了从ORACLE数据库中批量导入和导出数据的功能。 一、预备工作 在...

    oracle 导入导出命令.txt

    oracle导入导出常用命令文档 常用的exp关键字 1、full用于导出整个数据库,在rows=n一起使用,导出整个数据库的结构。 如:exp userid=gwm/gwm file=/test.dmp log=test.log full=y rows=n direct=y 2、OWNER和...

    Oracle导入导出xls[归纳].pdf

    Oracle数据库的导入导出操作是数据库管理中的常见任务,尤其在数据迁移、备份或数据分析时。本文将详细讲解如何在Oracle环境中将数据导出到Excel(.xls)格式,以及如何从Excel或文本文件导入数据到Oracle数据库。 ...

    ORACLE 常用手册导入导出

    --导出ORACLE参数 参数 说明 USERID 确定执行导出实用程序的用户名和口令 BUFFER 确定导出数据时所使用的缓冲区大小,其大小用字节表示 FILE 指定导出的二进制文件名称,默认的扩展名是.dmp FULL 指定是否以全部...

    Oracle数据导入/导出软件

    4. **性能优化**:OraLoader通常会优化数据导入导出的性能,例如使用多线程处理、批量插入等方式,以提高数据传输速度,尤其对于大数据量的操作,性能优化至关重要。 5. **错误处理和日志记录**:在数据导入导出...

    oracle数据(文本)导出小工具

    总结,Oracle 数据(文本)导出小工具 SQL*Loader 是一个强大且灵活的数据迁移工具,适合大量数据的导入导出操作。在不同的操作系统环境下,有对应版本的 SQL*Loader 可供选择,以满足多样化的需求。通过熟练掌握 SQL*...

    oracle导出txt文件方法

    Oracle 导出 txt 文件方法 Oracle 导出 txt 文件方法是指使用 spool 命令将 Oracle 数据库中的数据导出到 ...Oracle 导出 txt 文件方法可以满足不同需求的数据导出需求,并且可以自定义导出格式,以便于程序直接导入。

    Oracle导入导出图片及Excel(标注:没有源代码!)

    "Oracle导入导出图片及Excel"这个主题涉及到如何在Oracle环境中高效地处理非结构化的图片和Excel表格数据。由于没有提供源代码,我们将探讨一般性的方法和技术。 1. **Oracle BLOB类型**:Oracle数据库使用BLOB...

    Oracle导出Clob,Blob工具版本2

    Oracle数据库在存储大对象(BLOB和CLOB)时提供了强大的功能,但处理这些类型的数据进行导入导出可能会带来挑战。"Oracle导出Clob,Blob工具版本2" 是一个专为解决这个问题而设计的应用程序,它改进了对CLOB...

    oracle数据库导入数据以及创建用户

    expdp导出数据到目录对象,而impdp则将这些导出的数据导入到数据库中。 - **SQL INSERT语句**:对于小规模的数据导入,可以使用SQL插入语句一行一行地导入数据。但这种方式效率较低,不适合大量数据。 2. 创建用户...

    oracle快速导出.zip

    总结来说,"Oracle快速导出.zip" 提供了一个高效的数据导入导出解决方案,结合了`expdp`和`sqlldr`的优点,尤其适用于处理大规模数据。使用这个工具,你可以快速地备份或迁移数据,同时减少对服务器资源的占用。不过...

    oracle导入导出

    Oracle数据库的导入导出是数据库管理中的重要环节,主要用于数据迁移、备份恢复和系统复制等操作。在Oracle中,主要有两种工具用于实现这一目的:`IMP`(Import)和`EXP`(Export)。这两个工具提供了对数据库对象和...

    oracle 常用语句 oracle备份 oracle冷备份 oracle启停 oracle导出 oracle导入

    --按参数文件方式导出,将要导出的命令写在文本文件中 ..................(见附件) --导入ORACLE参数 参数 说明 USERID 指定执行导入的用户名和密码 BUFFER 指定用来读取数据的缓冲区大小,以字节为单位 COMMIT ...

Global site tag (gtag.js) - Google Analytics