2009-07-22 15 views
0

.NETで実行するOracle SQLの作成には何らかの助けが必要です。ヘルプ条件付のOracle SQLの作成

テーブルの列を更新する必要がありますが、同じ値を更新する値は2つの異なる値に依存します。一例を与えるために:

点心は、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としてsqlcmdのは「collcmd収集のために、ここでの取引と更新を実行します。

明らかに、条件が満たされているSQLにアップデートを配置する必要があります。親切なアドバイス。私はここで非問合せを実行することはできません。なぜなら、更新が失敗した場合、トランザクションのロールバックを実行する必要があるからです。私はすべての更新ステートメントを1つのコレクションに入れ、1つのトランザクションで更新を実行しています。しかし、tableAの値は次の反復で異なる場合があります。

上記の文の前に実行される他のSQLコマンドがあるので、格納されたproc内に同じものを置くことはできません。

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...." 

ありがとう:

更新のようなものを行くとSQLを作成する方法はあります。

+0

Where句に関する詳細を教えてください。 –

+0

where句は、まっすぐ前方にあり、主キー(id)のようなものです。 私がここで問題になっているのは、すべてのSQL selectを文字列にロールアップしてコレクションに配置し、コレクション内の各コマンドをトランザクション内で実行して、1つの更新が失敗したときにロールバックメカニズムを持つことができるようにすることです。しかし、上記のステートメントでは、UPDATEコマンドのSELECTクエリの値が必要なので、SELECTクエリの条件を更新に含める必要があります。 – Batuta

答えて

3

あなたがそうよう、CASE式を使用する必要があります場合は、(A、B、C)=(SELECT A、B、C ...)構文を使用しても

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>; 

注便利ですが、使用されていないSQLの機能=あなたは単一の値(スカラー)だけでなく、複数の値(ベクトル)を比較することができます。

+0

これはある程度私のために働いていた.... しかし、ケースが変更された場合、つまりCASE WHEN()ス​​テートメントの内部では、値がさらにデータベースのバリデーションを渡す必要はありますか? のように:(tblC.id = 1> 0 tblC FROM COL1を選択し、tblD.id = 2> tblD FROM COL1を選択してください0) どのように私はこれを構築することができるようになります CASE? – Batuta

+0

あなたの新しい要件を理解するのが難しいです。上のWHEN句は意味がありません(あなたはWHEN(SELECT ...)と言っていますが、SELECTSによって返された結果の比較演算はどこですか)。さらに、私は、あなたが最初にこのすべてを行う必要がある理由を正確に理解するのに苦労しています。単一のステートメントの要件はなぜなのですか?ロジックが非常に複雑な場合、匿名のPL/SQLブロックまたはプロシージャを使用できないのはなぜですか?そして、あなたは正確に何をしようとしていますか?戦術的な問題から一歩後退する必要のある問題の一つのようです。 –

+0

基本的に、投稿したCaseステートメントでは、tableAからの0、0の2つの列を比較しています。私は、例えばtableA.col1の値をtableC.Col1と比較し、tableA.col2の値をtableC.Col2と比較する方法があるかどうかを尋ねていました。両方のバリデーションが渡された場合は、列の値THENブロックに更新を設定する。 私が言及したように、私はこの問題に関してSPを使うことはできません。なぜ私ができないのかを説明するのは難しいですが、間違いなくSPの問題は解決していません。 – Batuta

1

ストアドプロシージャ/パッケージに必要なロジックを書いて.NETから呼び出してみませんか?

+0

他のsqlコマンドが実行されていると同時に、データベースから来ていない値が生成されるため、ヘッドアップに感謝しますが、明らかにストアドプロシージャを利用できません。 – Batuta

0

これを行うには、ストアドプロシージャが最適です。他のSQLコマンドを使用している場合は、トランザクションを使用します。ストアドプロシージャとして実行するには、データベースからのデータではないコミット(またはロールバック)を挿入します。

何かが変更された場合、SQLではストアドプロシージャが無効になります.SQLは実行されません。ランタイムエラーをユニットテストするまで待つ必要があります。ストアドプロシージャ(class.method)の呼び出しを非常に簡単にする生成コードを使用します。

免責事項:私はストアドプロシージャの狂信的な人ではありません。私はストアドプロシージャとORMを各瞬間に最適なものとして使用します。それは場合によって異なります。

+0

ストアドプロシージャは、私が持っているケースで最も適合しません。とにかく頭のおかげで、ありがとう。 – Batuta

関連する問題