帮助构造具有条件的Oracle SQL

时间:2009-07-22 10:36:12

标签: sql oracle

我需要一些帮助来创建一个我将在.NET中执行的Oracle SQL。

我需要更新表中的列,但更新相同的值将取决于两个不同的值。举个例子:

Dim sqlcmd as String Dim collCmd as Collection     对于x = 1到intCount

sqlcmd = "Update tableA Set col1 = :val1, col2 = :val2 Where...."

collcmd.add(sqlcmd)


SELECT col1, col2
FROM tableA 
Where .....

If col1 = 0 and col2 = 0 then
 sqlcmd = "Update tableB 
 Set col1 = :value
 Where...."
Else
 sqlcmd = "Update tableB
  Set col1 = :value
  Where.."
End If

collcmd.add(sqlcmd)
Next

'在此处为collcmd集合执行带事务的更新。

显然,我需要将更新放在符合条件的sql中。好心提醒。我不能在这里执行一次非查询,因为如果其中一个更新失败,那么我需要执行事务回滚。我将所有更新语句放在一个集合中,并在一个事务中执行更新。但是在下一次迭代中tableA的值可能会有所不同。

请注意,我不能将其放在存储过程中,因为还有其他sql命令在上述语句之前执行。

有没有办法创建一个SQL,其中的更新类似于:

sqlcmd = "UPDATE tableB b
          IF select a.col1 = 0 and select a.col2 = 0 from tableA a
          SET b.col1 = "this value"
          ELSE
          SET b.col1 = "other value"
          WHERE...."

感谢。

3 个答案:

答案 0 :(得分:3)

您需要使用CASE表达式,如下所示:

  UPDATE tableB
     SET col1 = 
         CASE WHEN (0, 0) = (SELECT col1, col2 
                               FROM tableA 
                              WHERE <tableA constraints>
                            )
              THEN "this value"
              ELSE "that value"
         END
   WHERE <tableB constraints>;

还要注意案例是使用(a,b,c)=(选择A,B,C ......)语法,这是一个方便但未充分利用的sql特性=你不仅可以比较单个值(标量) )但是多个值(向量)。

答案 1 :(得分:1)

为什么不在存储过程/包中编写所需的逻辑并从.NET调用它?

答案 2 :(得分:0)

最好的办法是使用存储过程。如果你有其他sql命令或者什么,那么使用事务:作为存储过程运行,你想要插入不是来自数据库,提交(或回滚)的数据。

如果某些内容发生了变化,存储过程在text-sql上变得无效则不会发生,您必须等待单元测试o运行时错误。我们使用生成的代码,可以很容易地调用存储过程(class.method)。

免责声明:我不是存储过程的狂热分子。我使用存储过程和ORM作为每个时刻的最佳选择。这取决于具体情况。