Oracle 臨時(shí)表 OracleDataAdapter 批量更新的實(shí)現(xiàn)思路
Oracle 臨時(shí)表 OracleDataAdapter 批量更新
/// <summary>
/// 注意,字段名必需大小寫保持一致
/// </summary>
protected static string updateSql = @"
Merge into Table_Name T
Using TempTable S
ON (T.USER_ID = S.USERID )
WHEN MATCHED
THEN UPDATE SET T.NICK_NAME = S.NICKNAME,T.PHONENUMBER = S.PHONENUMBER ,T.AVATAR = S.AVATAR,T.JOB = S.JOB
";
protected static string crateTemplateSql = @"
declare tableExistedCount number; --聲明變量存儲(chǔ)要查詢的表是否存在
p_sql varchar(200);
Begin
select count(1) into tableExistedCount from user_tables t where t.table_name = upper('TempTable'); --從系統(tǒng)表中查詢當(dāng)表是否存在
DBMS_OUTPUT.PUT_LINE(tableExistedCount);
if tableExistedCount >0 then --如果不存在,使用快速執(zhí)行語(yǔ)句創(chuàng)建新表
DBMS_OUTPUT.PUT_LINE('刪除舊表');
for r in (select a.table_name from user_tables a where a.table_name =upper('TempTable')) loop
p_sql:='TRUNCATE TABLE '||r.table_name;
DBMS_OUTPUT.PUT_LINE(p_sql);
execute immediate p_sql;
p_sql:='drop table '||r.table_name;
DBMS_OUTPUT.PUT_LINE(p_sql);
execute immediate p_sql;
end Loop;
end if;
execute Immediate
'
create global temporary table TempTable (
userId Varchar(255),
nickName Varchar(255) NULL,
phonenumber Varchar(255) NULL,
avatar Varchar(255) NULL,
job Varchar(255) NULL
)
on commit delete rows
';
end;";
/// <summary>
/// SqlBulkCopy 批量更新數(shù)據(jù)
/// </summary>
/// <param name="dataTable">數(shù)據(jù)集</param>
/// <param name="crateTemplateSql">臨時(shí)表創(chuàng)建字段</param>
/// <param name="updateSql">更新語(yǔ)句</param>
public static void BulkUpdateData(DataTable dataTable, string crateTemplateSql, string updateSql)
{
using (var conn = new Oracle.ManagedDataAccess.Client.OracleConnection(ConfigurationManager.ConnectionStrings["dbCon"].ConnectionString))
{
OracleTransaction trans = null;//關(guān)鍵第一步
using (var command = new Oracle.ManagedDataAccess.Client.OracleCommand("", conn))
{
try
{
conn.Open();
trans = conn.BeginTransaction();
//數(shù)據(jù)庫(kù)并創(chuàng)建一個(gè)臨時(shí)表來(lái)保存數(shù)據(jù)表的數(shù)據(jù)
command.CommandText = crateTemplateSql;
command.ExecuteNonQuery();
OracleCommand selectCmd=conn.CreateCommand();
//查詢表頭
selectCmd.CommandText = "select userId,nickName,phonenumber,avatar,job from TempTable where rownum=0";
OracleDataAdapter myDataAdapter = new OracleDataAdapter(selectCmd);
DataTable data = new DataTable();
myDataAdapter.Fill(data);
foreach (DataRow row in dataTable.Rows) {
DataRow newRow = data.NewRow();
newRow["userId"] = row["userId"];
newRow["nickName"] = row["nickName"];
newRow["phonenumber"] = row["phonenumber"];
newRow["avatar"] = row["avatar"];
newRow["job"] = row["job"];
data.Rows.Add(newRow);
}
//插入語(yǔ)句
myDataAdapter.InsertCommand=new OracleCommand("insert into TempTable(userId,nickName,phonenumber,avatar,job) values(:userId,:nickName,:phonenumber,:avatar,:job)", conn);
OracleCommandBuilder custCB = new OracleCommandBuilder(myDataAdapter);
custCB.ConflictOption = ConflictOption.OverwriteChanges;
custCB.SetAllValues = true;
foreach (DataColumn c in dataTable.Columns)
{
OracleParameter oraParameter = new OracleParameter(c.ColumnName, OracleDbType.Varchar2);
oraParameter.SourceColumn = c.ColumnName;
oraParameter.SourceVersion = DataRowVersion.Current;
myDataAdapter.InsertCommand.Parameters.Add(oraParameter);
}
int count = myDataAdapter.Update(dataTable);
dataTable.AcceptChanges();
myDataAdapter.Dispose();
/*
var cmd = new OracleCommand("select count(*) from transaction_temp_tb_lz2 --where user_Id in('615896266','602185346') ", conn);
var obj = cmd.ExecuteScalar();
*/
// 執(zhí)行Command命令 使用臨時(shí)表的數(shù)據(jù)去更新目標(biāo)表中的數(shù)據(jù) 然后刪除臨時(shí)表
command.CommandTimeout = 300;
command.CommandText = updateSql;
try {
int num = command.ExecuteNonQuery();
trans.Commit();
}
catch (Exception ex) {
trans.Rollback();
throw ex;
}
}
finally
{
conn.Close();
}
}
}
}整體需求如下:
從外部獲取數(shù)據(jù),要更新到數(shù)據(jù)庫(kù)中的一張表,且每天都需要進(jìn)行數(shù)據(jù)同步
實(shí)現(xiàn)思路
在數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)事務(wù)臨時(shí)表,表結(jié)構(gòu)與外部獲得的數(shù)據(jù)保持,將數(shù)據(jù)導(dǎo)入到臨時(shí)表,然后使用 Merge into 語(yǔ)法進(jìn)行增刪改 操作
到此這篇關(guān)于Oracle 臨時(shí)表 OracleDataAdapter 批量更新的文章就介紹到這了,更多相關(guān)Oracle 臨時(shí)表 OracleDataAdapter 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Oracle數(shù)據(jù)庫(kù)創(chuàng)建存儲(chǔ)過(guò)程的示例詳解
這篇文章主要介紹了Oracle數(shù)據(jù)庫(kù)創(chuàng)建存儲(chǔ)過(guò)程的示例詳解,存儲(chǔ)過(guò)程是事先經(jīng)過(guò)編譯并存儲(chǔ)在數(shù)據(jù)庫(kù)中的一段SQL語(yǔ)句的集合,調(diào)用存儲(chǔ)過(guò)程可以簡(jiǎn)化應(yīng)用開(kāi)發(fā)人員的很多工作。對(duì)此感興趣可以了解一下2020-07-07
centos 6.5下安裝oracle 11gR2與Oracle自動(dòng)啟動(dòng)的配置
CentOS 下安裝 Oracle 是一件比較麻煩的事情,下面這篇文章主要介紹了在 centos 6.5下安裝oracle 11gR2的前的配置步驟,以及安裝完成后,如何設(shè)置為隨系統(tǒng)自動(dòng)啟動(dòng)。配置完成后,啟動(dòng)圖形化安裝,沒(méi)有什么可說(shuō)的,本文就沒(méi)有一一截圖。需要的朋友可以參考借鑒。2017-01-01
Oralce數(shù)據(jù)導(dǎo)入出現(xiàn)(SYSTEM.PROC_AUDIT)問(wèn)題處理方法
A數(shù)據(jù)庫(kù)打開(kāi)了審計(jì),而導(dǎo)入到B數(shù)據(jù)庫(kù)時(shí),B數(shù)據(jù)庫(kù)審計(jì)沒(méi)有打開(kāi),數(shù)據(jù)庫(kù)中沒(méi)有SYSTEM.PROC_AUDIT對(duì)象,本文將此問(wèn)題的解決方法,需要的朋友可以參考下2012-12-12
oracle 多個(gè)字符替換實(shí)現(xiàn)
CSDN上的一個(gè)網(wǎng)友,需要一個(gè)sql語(yǔ)句的解決方案需求是這樣的求寫oracle多個(gè)字符替換(有測(cè)試數(shù)據(jù))2009-10-10
Oracle 臨時(shí)表空間SQL語(yǔ)句的實(shí)現(xiàn)
臨時(shí)表空間用來(lái)管理數(shù)據(jù)庫(kù)排序操作以及用于存儲(chǔ)臨時(shí)表、中間排序結(jié)果等臨時(shí)對(duì)象,本文主要介紹了Oracle 臨時(shí)表空間SQL語(yǔ)句的實(shí)現(xiàn),感興趣的可以了解一下2021-09-09
oracle數(shù)據(jù)庫(kù)導(dǎo)入.dmp腳本的sql 語(yǔ)句
這篇文章主要介紹了oracle數(shù)據(jù)庫(kù)導(dǎo)入.dmp腳本的sql語(yǔ)句,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-07-07
在Oracle表中進(jìn)行關(guān)鍵詞搜索的過(guò)程
這篇文章主要介紹了在Oracle表中進(jìn)行關(guān)鍵詞搜索的過(guò)程,我們可以通過(guò)Oracle?SQL?Developer或Toad運(yùn)行PL/SQL塊,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06

