日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle ctl文件7c1b,批量生成控制文件,用sqlldr自动导入多个表的数据

發(fā)布時(shí)間:2023/12/19 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle ctl文件7c1b,批量生成控制文件,用sqlldr自动导入多个表的数据 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

生成控制文件

準(zhǔn)備工作:

SQL>set colsep ' ';    //-域輸出分隔符SQL>set echo off;     //顯示start啟動(dòng)的腳本中的每個(gè)sql命令,缺省為onSQL> set echo on//設(shè)置運(yùn)行命令是是否顯示語句SQL> set feedback on;//設(shè)置顯示“已選擇XX行”SQL>set feedback off;//回顯本次sql命令處理的記錄條數(shù),缺省為onSQL>set heading off;   //輸出域標(biāo)題,缺省為onSQL>set pagesize 0;   //輸出每頁行數(shù),缺省為24,為了避免分頁,可設(shè)定為0。SQL>set linesize 80;   //輸出一行字符個(gè)數(shù),缺省為80SQL>set numwidth 12;  //輸出number類型域長度,缺省為10SQL>set termout off;   //顯示腳本中的命令的執(zhí)行結(jié)果,缺省為onSQL>set trimout on;   //去除標(biāo)準(zhǔn)輸出每行的拖尾空格,缺省為offSQL>set trimspool on;  //去除重定向(spool)輸出每行的拖尾空格,缺省為offSQL>set serveroutput on; //設(shè)置允許顯示輸出類似dbms_output

1、spool control.all;

select ctl_name from (

select 'spool ctl/'||lower(table_name)||'.ctl' ctl_name,table_name, 0 cid from user_tables a

union all

select 'select ''LOAD DATA TRUNCATE into table '||table_name,table_name,0.1 cid from user_tables a

union all

select 'FIELDS TERMINATED BY ?x'||chr(39)||'03'||chr(39)||' OPTIONALLY ENCLOSED BY '||chr(39)||'"'||chr(39),table_name, 0.2 cid from user_tables a

union all

select 'TRAILING NULLCOLS',table_name,0.3 cid from user_tables a

union all

select '(' ,table_name,0.4 cid from user_tables a

union all

select b.tab_column_ora,a.table_name,0.5 cid from user_tables a,tab_column_union b where a.table_name=b.TABLE_NAME

union all

select ') '' from dual;' ,table_name,0.6 cid from user_tables a

union all

select 'spool off',table_name,0.7 cid from user_tables a

) aa order by table_name,cid;

spool off;

-----------生成一個(gè)新表tab_column_union,tab_column_ora字段對時(shí)間類型的col字段進(jìn)行處理,用gy_etl_download存儲(chǔ)過程處理。cid 偽列控制輸出順序。

-----------chr(39)是'的意思,兩個(gè)之間的部分有啥顯示啥。

-----------------------------------------

備注:生成tab_column_union的存儲(chǔ)過程 。

備注:

CREATE OR REPLACE PROCEDURE GY_ETL_DOWNLOAD as

n_count integer;

v_column_ora varchar2(4000);

begin

update tab_column_union set tab_column_db2=null;

for c1 in (select column_name,a.table_name,column_id,data_type from user_tables a,user_tab_columns b where a.table_name=b.TABLE_NAME order by a.table_name,column_id)

loop

n_count:=0;

v_column_ora:=null;

select count(*) into n_count from tab_column_ex where table_name=c1.table_name and tab_column=c1.column_name;

if n_count> 0 then

select 'to_date'||'('||c1.column_name||','||chr(39)||'yyyy-mm-dd-hh24.mi.ss'||chr(39)||')' into v_column_ora from dual;

update tab_column_union set tab_column_ora=tab_column_ora||v_column_ora||',' where table_name=c1.table_name;

else

if c1.data_type='DATE' then

select c1.column_name||'"to_date(:'||c1.column_name||','||chr(39)||'yyyymmdd'||chr(39)||')"' into v_column_ora from dual;

update tab_column_union set tab_column_ora=tab_column_ora||v_column_ora||',' where table_name=c1.table_name;

else

update tab_column_union set tab_column_ora=tab_column_ora||c1.column_name||',' where table_name=c1.table_name;

end if;

end if;

END LOOP;

update tab_column_union t set tab_column_db2=substr(t.tab_column_db2,1,length(t.tab_column_db2)-1);

update tab_column_union t set tab_column_ora=substr(t.tab_column_ora,1,length(t.tab_column_ora)-1);

COMMIT;

end GY_ETL_DOWNLOAD;

----------------------------------------

2、在sqlplus里運(yùn)行control.all腳本

SQL>@control.all

批量生成控制文件

3、執(zhí)行命令腳本,腳本保存為impdata.sh

#!/bin/sh

#獲取當(dāng)前目錄

currDir=`dirname $0`

cd $currDir

currDir=`pwd`

#數(shù)據(jù)庫連接串

dbConnStr=joey/jy_123orcl11g

#數(shù)據(jù)文件保存目錄

dataDir=$currDir/data

#控制文件

controlFile=$currDir/ctl/

#設(shè)置環(huán)境變量

#ORACLE_HOME=/opt/oracle/product/10201

#PATH=$PATH:$ORACLE_HOME/bin

#日志根目錄

baseLogDir=$currDir/log

#插入失敗數(shù)據(jù)的記錄的目錄

badLogDir=$baseLogDir/bad

#執(zhí)行日志目錄 ?(導(dǎo)入日志)

impLogDir=$baseLogDir/imp

#命令執(zhí)行日志目錄 (錯(cuò)誤記錄)

cmdLogDir=$baseLogDir/cmd

#創(chuàng)建日志目錄

mkdir -p $badLogDir 2> /dev/null

mkdir -p $impLogDir 2> /dev/null

mkdir -p $cmdLogDir 2> /dev/null

for dataFile in `ls ${dataDir}/*.del`

do

logDateSuffix=`date "+%Y%m%d%H%M%S"`

sqlldr $dbConnStr \

silent=all errors=10000 \

data=$dataFile \

log=$impLogDir/`basename ${dataFile}`.$logDateSuffix.imp \

bad=$badLogDir/`basename ${dataFile}`.$logDateSuffix.bad \

control= $controlFile/`basename ${dataFile}`.ctl \

> /dev/null \

2>> $cmdLogDir/`basename ${dataFile}`.${logDateSuffix}.log

done

運(yùn)行腳本 ?$./impdata.sh

總結(jié)

以上是生活随笔為你收集整理的oracle ctl文件7c1b,批量生成控制文件,用sqlldr自动导入多个表的数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。