Oracle自動導出和導入

跳轉到Github

使用方法及說明

1. 運行環境

  • Windows系統
  • 需要安裝Oracle客戶端
  • 可以使用sqlplus
  • 可以使用sqlldr

2. 功能描述

提供導出和導入功能

2.1. 導出

  • 通過Oraclespool導出csv(逗號分隔符,雙引號定界符)格式
  • 通過讀取Oracle自帶的user_tab_cols表,獲取表結構,並且生成建表腳本
  • 通過讀取Oracle自帶的user_tab_cols表,獲取表結構,並且生成sqlldr控制文件

2.2. 導入

  • 使用Oraclesqlldr導入數據,需要的建表腳本和控制文件已經在導出時準備好

3. 使用方法

3.1. 配置

配置文件位於conf目錄中

  • db.ini

用戶配置數據庫連接

ora_ip=localhost
ora_port=1521
ora_sid=orcl
ora_uid=scott
ora_pwd=tiger
  • list.ini

列出需要導出的表,每行一個表

EMP
DEPT

3.2. 運行-導出

  1. 運行initialize.bat初始化目錄
  2. 修改conf\db.ini配置文件
  3. 運行run_export.bat導出數據

3.3. 運行-導入

  1. 運行run_import.bat導入

4. 導出樣例

DEPT.csv

"10","ACCOUNTING","NEW YORK"
"20","RESEARCH","DALLAS"
"30","SALES","CHICAGO"
"40","OPERATIONS","BOSTON"

EMP.csv

"7369","SMITH","CLERK","7902","19801217000000","800","","20"
"7499","ALLEN","SALESMAN","7698","19810220000000","1600","300","30"
"7521","WARD","SALESMAN","7698","19810222000000","1250","500","30"
"7566","JONES","MANAGER","7839","19810402000000","2975","","20"
"7654","MARTIN","SALESMAN","7698","19810928000000","1250","1400","30"
"7698","BLAKE","MANAGER","7839","19810501000000","2850","","30"
"7782","CLARK","MANAGER","7839","19810609000000","2450","","10"
"7788","SCOTT","ANALYST","7566","19870419000000","3000","","20"
"7839","KING","PRESIDENT","","19811117000000","5000","","10"
"7844","TURNER","SALESMAN","7698","19810908000000","1500","0","30"
"7876","ADAMS","CLERK","7788","19870523000000","1100","","20"
"7900","JAMES","CLERK","7698","19811203000000","950","","30"
"7902","FORD","ANALYST","7566","19811203000000","3000","","20"
"7934","MILLER","CLERK","7782","19820123000000","1300","","10"

代碼

initialize.bat

md ctab
md ctl
md data
md log
md sql
del /Q sql\*.sql
del /Q data\*.csv
del /Q ctl\*.ctl
del /Q ctab\*.sql
del /Q log\*.log

export.bat

@echo off
::獲取入參
set tablename=%1
if "%tablename%"=="" (
    goto end
)
::讀取數據庫配置
for /f "delims=;" %%a in (conf\db.ini) do (
set %%a
)
::生成文件
echo set trimspool on>sql\%tablename%_sql.sql
echo set linesize 4000>>sql\%tablename%_sql.sql
echo set pagesize 0 >>sql\%tablename%_sql.sql
echo set newpage 1 >>sql\%tablename%_sql.sql
echo set heading off>>sql\%tablename%_sql.sql
echo set term off>>sql\%tablename%_sql.sql
echo set feedback off>>sql\%tablename%_sql.sql
echo alter session set nls_date_format='yyyymmddhh24miss';>>sql\%tablename%_sql.sql
::生成導出數據的sql文件
echo spool sql\%tablename%_data.sql>>sql\%tablename%_sql.sql
echo select 'select '^|^|listagg('''"''||'||column_name||'||''"''','^|^|'',''^|^|')within group(order by column_id) ^|^|' from %tablename%;' from user_tab_cols where table_name = '%tablename%';>>sql\%tablename%_sql.sql
echo spool off>>sql\%tablename%_sql.sql

::導出數據功能模塊
echo spool data\%tablename%.csv>>sql\%tablename%_sql.sql
echo @@sql\%tablename%_data.sql;>>sql\%tablename%_sql.sql
echo spool off>>sql\%tablename%_sql.sql

::生成建表腳本
echo spool ctab\%tablename%.sql>>sql\%tablename%_sql.sql
echo SELECT 'CREATE TABLE ' ^|^| '%tablename%' ^|^| CHR(10) ^|^| '(' ^|^| CHR(10) ^|^|>>sql\%tablename%_sql.sql
echo LISTAGG(' ' ^|^| T1.COLUMN_NAME ^|^| ' ' ^|^| CASE>>sql\%tablename%_sql.sql
echo WHEN DATA_TYPE = 'NUMBER' THEN 'NUMBER'>>sql\%tablename%_sql.sql
echo WHEN DATA_TYPE = 'VARCHAR2' THEN>>sql\%tablename%_sql.sql
echo DATA_TYPE ^|^| '(' ^|^| DATA_LENGTH ^|^| ')'>>sql\%tablename%_sql.sql
echo WHEN DATA_TYPE = 'DATE' THEN>>sql\%tablename%_sql.sql
echo 'DATE'>>sql\%tablename%_sql.sql
echo ELSE>>sql\%tablename%_sql.sql
echo DATA_TYPE>>sql\%tablename%_sql.sql
echo END,>>sql\%tablename%_sql.sql
echo ',' ^|^| CHR(10)) WITHIN GROUP(ORDER BY COLUMN_ID) ^|^| CHR(10) ^|^| ');'^|^|chr(10)^|^|'exit;'>>sql\%tablename%_sql.sql
echo FROM USER_TAB_COLUMNS T1>>sql\%tablename%_sql.sql
echo WHERE T1.TABLE_NAME = '%tablename%';>>sql\%tablename%_sql.sql
echo spool off>>sql\%tablename%_sql.sql

::生成sqlldr控制文件
echo spool ctl\%tablename%.ctl>>sql\%tablename%_sql.sql
echo select 'LOAD DATA'^|^|chr(10)^|^| >>sql\%tablename%_sql.sql
echo 'INFILE ''data\%tablename%.csv'''^|^|chr(10)^|^| >>sql\%tablename%_sql.sql
echo 'APPEND INTO TABLE %tablename%'^|^|chr(10)^|^| >>sql\%tablename%_sql.sql
echo 'FIELDS TERMINATED BY '',''' ^|^|chr(10)^|^| >>sql\%tablename%_sql.sql
echo 'OPTIONALLY ENCLOSED BY ''^"'''^|^|chr(10)^|^| >>sql\%tablename%_sql.sql
echo 'TRAILING NULLCOLS'^|^|chr(10)^|^|'('^|^|listagg(f_cbind(column_name, >>sql\%tablename%_sql.sql
echo case when data_type = 'DATE' then 'date "yyyymmddhh24miss"' >>sql\%tablename%_sql.sql
echo when data_length ^> 255 then 'char(4000)' else null end, ' '), >>sql\%tablename%_sql.sql
echo ',' ^|^| chr(10)) within group(order by column_id)^|^|')' >>sql\%tablename%_sql.sql
echo from user_tab_cols t >>sql\%tablename%_sql.sql
echo where table_name = '%tablename%';>>sql\%tablename%_sql.sql
echo spool off>>sql\%tablename%_sql.sql

echo exit;>>sql\%tablename%_sql.sql

sqlplus -s %ora_uid%/%ora_pwd%@%ora_ip%:%ora_port%/%ora_sid% @sql\%tablename%_sql.sql

run_export.bat

@echo off
::創建Oracle函數
for /f "delims=;" %%a in (conf\db.ini) do (
set %%a
)
sqlplus -s %ora_uid%/%ora_pwd%@%ora_ip%:%ora_port%/%ora_sid% @conf\f_cbind.fnc
::開始導出
for /f "delims=;" %%a in (conf\list.ini) do (
call export.bat %%a
echo %%a 導出完成.
)
exit

run_import.bat

@echo off
::加載數據庫配置
for /f "delims=;" %%a in (conf\db.ini) do (
set %%a
)

for /f "delims=;" %%a in (conf\list.ini) do (
::建表
sqlplus %ora_uid%/%ora_pwd%@%ora_ip%:%ora_port%/%ora_sid% @ctab\%%a.sql
::入庫
sqlldr %ora_uid%/%ora_pwd%@%ora_ip%:%ora_port%/%ora_sid% control=ctl\%%a.ctl log=log\%%a.log bad=log\%%a.bad skip=0 direct=true rows=2000
)
exit
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章