2012-07-12 30 views
1

我希望能够根据输入参数的值通过存储过程更新表中的哪个字段。如果输入字段等于'草稿',它应该更新id_draft,否则它应该更新ID。 这可能吗?Oracle更新字段A或字段B取决于输入参数

这是我失败的尝试之一,可以帮助说明我想做的事:

CREATE OR REPLACE PROCEDURE sp_test (input_field VARCHAR DEFAULT NULL) 
IS 
    BEGIN 
     UPDATE TABLE 
     SET 
     CASE 
      WHEN input_field = 'draft' THEN id_draft 
      ELSE id 
    END = 'x' 

回答

2

不能使用CASE语句更改查询的结构本身。它只返回数据,这是一个函数。

你有什么(CASE WHEN input_field = 'draft' then id_draft ELSE id END)无论是在id字段或id_draft场返回。这就像这样......

UPDATE 
    yourTable 
SET 
    CASE WHEN 'abc' = 'draft' THEN 123 ELSE 789 END = 'x' 

相反,你需要把CASE语句在右手边...

UPDATE 
    yourTable 
SET 
    id  = CASE WHEN input_field = 'draft' THEN id ELSE 'x'  END, 
    id_draft = CASE WHEN input_field = 'draft' THEN 'x' ELSE id_draft END 

但是,实际上,你可能只是更好做这...

IF (input_field = 'draft') 
    UPDATE yourTable SET id_draft = 'x' 
ELSE 
    UPDATE yourTable SET id = 'x' 

编辑:*

要使用从值另一张桌子,而不是只是'x',你可以用这样的东西...

UPDATE 
    yourTable 
SET 
    id  = CASE WHEN input_field = 'draft' THEN yourTable.id ELSE otherTable.x  END, 
    id_draft = CASE WHEN input_field = 'draft' THEN otherTable.x ELSE yourTable.id_draft END 
FROM 
    otherTable 
WHERE 
    otherTable.a=? AND otherTable.b=? 
+0

谢谢德姆斯,为快速回复。 – htrufan 2012-07-12 09:05:19

+0

如何处理一些小技巧,而不是'x',我使用'(从table2中选择字段,其中a = 1和b = 2 c = ...)'。有没有办法做到这一点,而不必指定相同的大选择两次? – htrufan 2012-07-12 09:08:36

+0

看起来Oracle不喜欢“update set from”,但这个[link](http://luckylarry.co.uk/programming-tutorials/oracle/oracle-update-from-equivalent/)的方法似乎使它快乐。 – htrufan 2012-07-12 11:47:12