excel表的資料update到oracle裡面
在測試環境中,我將excel裡面的電話等資訊,update到了tb使用者下的tb_sta_emp表裡面,請測試資料更新是否正確。
如測試正常,後續會在生產環境按照此方法進行更新。
以下是我的實施方法(不知是否還有其他更好的方法),供稽核。
前提:先要備份,備份,備份!!!
expdp tb52/xxxx directory=EXPDP_DIR dumpfile=tb_sta_emp.dmp tables=tb_sta_emp
impdp \'/ as sysdba\' directory=PUMP_DIR dumpfile=TB52.201603221101.dmp17 logfile=TBimpdp.log REMAP_SCHEMA=TB52:TB52
前提:先要備份,備份,備份!!!
expdp tb52/xxxx directory=EXPDP_DIR dumpfile=tb_sta_emp.dmp tables=tb_sta_emp
impdp \'/ as sysdba\' directory=PUMP_DIR dumpfile=TB52.201603221101.dmp17 logfile=TBimpdp.log REMAP_SCHEMA=TB52:TB52
1、將excel表格另存為csv(帶逗號)格式;
2、設定作業系統字符集和資料庫一致,防止匯入出現亂碼:
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
3、將csv格式的表格,透過sqlldr工具匯入到oracle的t1表(臨時表);
create table t1
(
C_CODE VARCHAR2(256),
C_NAME VARCHAR2(256),
C_OFFICE_TEL VARCHAR2(256),
C_SJ VARCHAR2(256),
C_GSYX VARCHAR2(256),
C_OID VARCHAR2(36)
);
4、excel表裡面的空值都用czxin填充。
create table t1
(
C_CODE VARCHAR2(256),
C_NAME VARCHAR2(256),
C_OFFICE_TEL VARCHAR2(256),
C_SJ VARCHAR2(256),
C_GSYX VARCHAR2(256),
C_OID VARCHAR2(36)
);
[oracle@hr ~]$ cat /home/oracle/1.ctl
LOAD DATA
INFILE '/home/oracle/1.csv'
append INTO TABLE t1
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
trailing nullcols
(c_code,c_name, c_office_tel,c_sj,c_gsyx,C_OID)
備註:如果excel欄位有日期格式的,就在控制檔案裡面進行格式化,如optionally enclosed by '"'
(stat_date timestamp "yyyy-mm-dd hh24:mi:ss", stat_num)
LOAD DATA
INFILE '/home/oracle/1.csv'
append INTO TABLE t1
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
trailing nullcols
(c_code,c_name, c_office_tel,c_sj,c_gsyx,C_OID)
備註:如果excel欄位有日期格式的,就在控制檔案裡面進行格式化,如optionally enclosed by '"'
(stat_date timestamp "yyyy-mm-dd hh24:mi:ss", stat_num)
[oracle@hr ~]$ sqlldr tb52/xxxxx control=/home/oracle/1.ctl bad=/home/oracle/bad.txt log=/home/oracle/log.txt
5、用PL/SQL的匿名塊,透過遍歷遊標的方式,將員工工號c_code將t1表(臨時表)和tb_sta_emp關聯,然後把t1表中的電話等資訊update到tb_sta_emp中:
declare
cursor c1 is select a.* from tb_sta_emp a,t1 b where a.C_CODE=b.C_CODE for update nowait; --這麼寫的原因是為了防止出現no data found的錯誤,否則進入異常處理,oracle不會再返回begin end部分執行了;主要防止出現tb_sta_emp表裡面有的,而t1表裡面沒有
v_C_CODE tb_sta_emp.C_CODE%type;
v_C_NAME t1.C_NAME%type;
v_C_SJ t1.C_SJ%type;
v_C_OFFICE_TEL t1.C_OFFICE_TEL%type;
v_C_GSYX t1.C_GSYX%type;
v_C_OID t1.C_OID%type;
i number(30);
begin
i:=0;
for k in c1 loop
v_C_CODE:=k.C_CODE;
select C_SJ into v_C_SJ from t1 where C_CODE=v_C_CODE and rownum=1; --透過員工編號C_CODE關聯t1表和tb_sta_emp兩張表
select C_GSYX into v_C_GSYX from t1 where C_CODE=v_C_CODE and rownum=1; --寫rownum=1是為了防止出現fetch too many rows的錯誤
select C_OFFICE_TEL into v_C_OFFICE_TEL from t1 where C_CODE=v_C_CODE and rownum=1;
i:=i+1;
dbms_output.put_line(v_C_CODE||' '||v_C_SJ||'正在處理第幾行:'||i);
if v_C_SJ!='czxin' --如果t1表的這列值為czxin,即表示excel表這列原來是空值,就不update tb_sta_emp表的值
then
update tb_sta_emp set C_SJ=v_C_SJ where C_CODE=v_C_CODE;--你遊標指誰我update 誰
end if;
if v_C_GSYX!='czxin'
then
update tb_sta_emp set C_GSYX=v_C_GSYX where C_CODE=v_C_CODE;--你遊標指誰我update 誰
end if;
if v_C_OFFICE_TEL!='czxin'
then
update tb_sta_emp set C_OFFICE_TEL=v_C_OFFICE_TEL where C_CODE=v_C_CODE;--你遊標指誰我update 誰
end if;
end loop;
commit;
end;
/
cursor c1 is select a.* from tb_sta_emp a,t1 b where a.C_CODE=b.C_CODE for update nowait; --這麼寫的原因是為了防止出現no data found的錯誤,否則進入異常處理,oracle不會再返回begin end部分執行了;主要防止出現tb_sta_emp表裡面有的,而t1表裡面沒有
v_C_CODE tb_sta_emp.C_CODE%type;
v_C_NAME t1.C_NAME%type;
v_C_SJ t1.C_SJ%type;
v_C_OFFICE_TEL t1.C_OFFICE_TEL%type;
v_C_GSYX t1.C_GSYX%type;
v_C_OID t1.C_OID%type;
i number(30);
begin
i:=0;
for k in c1 loop
v_C_CODE:=k.C_CODE;
select C_SJ into v_C_SJ from t1 where C_CODE=v_C_CODE and rownum=1; --透過員工編號C_CODE關聯t1表和tb_sta_emp兩張表
select C_GSYX into v_C_GSYX from t1 where C_CODE=v_C_CODE and rownum=1; --寫rownum=1是為了防止出現fetch too many rows的錯誤
select C_OFFICE_TEL into v_C_OFFICE_TEL from t1 where C_CODE=v_C_CODE and rownum=1;
i:=i+1;
dbms_output.put_line(v_C_CODE||' '||v_C_SJ||'正在處理第幾行:'||i);
if v_C_SJ!='czxin' --如果t1表的這列值為czxin,即表示excel表這列原來是空值,就不update tb_sta_emp表的值
then
update tb_sta_emp set C_SJ=v_C_SJ where C_CODE=v_C_CODE;--你遊標指誰我update 誰
end if;
if v_C_GSYX!='czxin'
then
update tb_sta_emp set C_GSYX=v_C_GSYX where C_CODE=v_C_CODE;--你遊標指誰我update 誰
end if;
if v_C_OFFICE_TEL!='czxin'
then
update tb_sta_emp set C_OFFICE_TEL=v_C_OFFICE_TEL where C_CODE=v_C_CODE;--你遊標指誰我update 誰
end if;
end loop;
commit;
end;
/
6、看t1(臨時表)裡面哪些資料在 tb_sta_emp裡面沒有,沒有的資料插入到tb_sta_emp裡面
select c_code,C_name from t1
minusselect c_code,C_name from tb_sta_emp ;
7、刪除臨時表:
drop table t1 purge
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28916011/viewspace-2062809/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 達夢資料庫如何將Excel表的資料複製到表中資料庫Excel
- Oracle 資料匯入ExcelOracleExcel
- 資料分析裡的鄙視鏈!EXCEL:感覺有被冒犯到Excel
- 如何將EXCEL資料表裡面的資料逆時針旋轉90度Excel
- Excel資料透視表怎麼做 Excel資料透視表技巧Excel
- Oracle中的for update 和 for update nowaitOracleAI
- Excel 表匯入資料Excel
- oracle使用儲存過程將表資料以excel格式匯出Oracle儲存過程Excel
- hisql orm update表資料更新文件SQLORM
- 匯入excel資源到資料庫Excel資料庫
- 使用Oracle SQL Developer匯入Excel資料OracleSQLDeveloperExcel
- 透視表excel透視表怎麼做 excel的資料透視表怎麼弄Excel
- 用python庫openpyxl操作excel,從源excel表中提取資訊複製到目標excel表中PythonExcel
- 前端讀取Excel表中資料前端Excel
- Oracle資料表碎片整理Oracle
- Net.Core匯入EXCel檔案裡的資料Excel
- 資料分析的熱門 Excel 面試問題Excel面試
- 【北亞資料恢復】誤刪除oracle表和誤刪除oracle表資料的資料恢復方法資料恢復Oracle
- java 從EXCEL匯入到資料庫JavaExcel資料庫
- 提取檔名字到excel表中Excel
- SAPABAP裡資料庫表的StorageParameters從哪裡來的資料庫
- SAP Hybris Commerce裡的資料庫表資料庫
- Oracle資料庫表碎片整理Oracle資料庫
- 伺服器癱瘓,裡面存有mysql資料庫表結構伺服器MySql資料庫
- MySQL面試題,如何書寫 update 避免表鎖?MySql面試題
- C# 將資料寫入到Excel表格C#Excel
- Python 自動化拉取 MySQL 資料並建表裝載到 OraclePythonMySqlOracle
- 【資料庫資料恢復】如何恢復Oracle資料庫truncate表的資料資料庫資料恢復Oracle
- DataX將MySql資料庫資料同步到Oracle資料庫MySql資料庫Oracle
- Oracle 資料庫整理表碎片Oracle資料庫
- web 端如何像 excel 裡的多 sheet 方式呈現資料WebExcel
- SAP ABAP裡資料庫表的Storage Parameters從哪裡來的資料庫
- 配置ORACLE資料庫到達夢資料庫的異構DBLINKOracle資料庫
- 行高在excel表哪裡調 excel怎麼調整行高Excel
- Oracle中刪除表中的重複資料Oracle
- DataX將Oracle資料庫資料同步到達夢資料庫Oracle資料庫
- Sqlserver update\delete用inner join關聯,會update\delete關鍵字後面的表關聯到的行SQLServerdelete
- excel表1和表2資料匹配 vlookup跨表兩個表格匹配Excel
- 海量資料Excel報表利器——EasyExcel(開場篇)Excel