使用方法及說明
1. 運行環境
- Windows系統
- 需要安裝Oracle客戶端
- 可以使用
sqlplus
- 可以使用
sqlldr
2. 功能描述
提供導出和導入功能
2.1. 導出
- 通過
Oracle
的spool
導出csv
(逗號分隔符,雙引號定界符)格式 - 通過讀取
Oracle
自帶的user_tab_cols
表,獲取表結構,並且生成建表腳本 - 通過讀取
Oracle
自帶的user_tab_cols
表,獲取表結構,並且生成sqlldr
控制文件
2.2. 導入
- 使用
Oracle
的sqlldr
導入數據,需要的建表腳本和控制文件已經在導出時準備好
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. 運行-導出
- 運行
initialize.bat
初始化目錄 - 修改
conf\db.ini
配置文件 - 運行
run_export.bat
導出數據
3.3. 運行-導入
- 運行
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