2016-11-11 118 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

相关问题