我需要一些帮助来创建一个我将在.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...."
感谢。
答案 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作为每个时刻的最佳选择。这取决于具体情况。