2016-11-11 30 views
1

我有一個int列表和c#中的字符串列表,其中int是主鍵,字符串是名稱。如何在oracle中更新多個行,每個行的條件不一樣

對於離:{1,2},{ 「拳頭」, 「第二」}

update table set name ="first" where id =1 
update table set name = "second" where id=2 

我需要使用過程中甲骨文更新值。

假設我有程序與作爲數組傳遞爲varchar

PROCEDURE updateName

ID。在VARCHAR,
名IN VARCHAR
)列表如下
IS BEGIN
END updatename。

什麼是我應該不使用case語句

+0

有什麼問題?你不知道如何更新與ado.net? –

+0

我需要在單個過程中進行批量更新 –

+0

您甚至不需要爲此執行過程,這是一個簡單的SQL語句。 (但是,這是在ado.net中完成的,我對此並不熟悉。) – mathguy

回答

1

OK暗示的邏輯,所以也許你有一個表,(他的名字最好不要是「表」!) - 讓我們說這就是所謂的TBL,至少有兩列,ID和名稱。你有一個字典,列ID和名稱(或任何其他列名稱)。

然後 - 使用merge聲明:

merge into tbl 
    using dictionary 
    on (tbl.id = dictionary.id) 
when matched then 
    update set name = dictionary.name 
; 

你也可以使用一個update聲明,但在更新從另一個表中讀取,merge更容易閱讀和維護,有時也可能是更高效。

+1

我幾乎可以肯定字典是一個'C#'列表 –

+0

@JuanCarlosOropeza - 那麼OP(或熟悉ado.net和C# - Oracle的人)將會展示如何將C#列表「視」爲視圖或臨時表。 – mathguy

+0

@NicholasKrasnov - 當然,這就是我**所寫的**。現在修復它。 – mathguy

0

標準SQL的方式是:

UPDATE table 
SET name = 
    CASE WHEN id=1 THEN "first" 
    CASE WHEN id=2 THEN "second" 
    END 
WHERE id IN (1,2) 

另一種選擇是創建一個臨時表,插入所有鍵值對,並在UPDATE聲明做了JOIN

+2

如果字典有800個項目,這將需要一段時間寫... – mathguy

+0

@mathguy不適用於計算機:) –

+0

哦 - 如果計算機將生成代碼,那麼我同意。 :-) – mathguy

相關問題