2012-02-23 7 views
1

は私が問題にして明確にしてみましょう - 私は、Oracleのテーブルにいくつかの列を更新するために使用されるクエリを持っている:同じ方法でプリペアドステートメントを使用する場合、列の更新をバイパスまたは回避する方法はありますか?

UPDATE MED_COM_MAPPER_CMDS SET STATUS = ?, OUTAGE_ID = ? WHERE CMD_ID = ? 

私は特定のを持っていない限り、条件付きOUTAGE_ID列値テーブルを更新しないしたいです値はSTATUS列にあります。これを以下に示す方法と同じ方法で実装するにはどうすればよいですか?メソッドの変更は許容されますが、あまりにも多くはありません。以下のコード行で示されているのと同じ方法でこれを行うことはできませんか?

Connection connection = DatabaseUtil.getConnection(); 
preparedStatement.setInt(1, Integer.parseInt(status)); 

// On a condition, how can i avoid updating this column value. 
// That means keep intact what it is in the DB. 
preparedStatement.setString(2, outage_id); 
preparedStatement.setString(3, cmd_id); 

int i = preparedStatement.executeUpdate(); 
connection.commit(); 

これは単純にすることです。これは、クエリまたはメソッドをオーバーライドすることによって、またはインデックス値のインクリメントを伴うif条件によって実行できます。

希望しています。

答えて

1

方法変更について更新文、のようなもの:

UPDATE MED_COM_MAPPER_CMDS 
SET STATUS = :stat, 
OUTAGE_ID = decode(status, 'X', :new_val, outage_id) 
WHERE CMD_ID = blah 
; 

ステータス= 'X'(ある既存のステータス値)であれば、その後、outage_id既存保つ他、new_valでoutage_id更新します。

+0

OUTAGE_ID列の既存の値を取得するには、その前にSELECTクエリを実行する必要があります。右 ? – Hari

+0

@ハリー・ナウ、アップデートの一部では、もう何も選択したりパスしたりする必要はありません。 Oracleは、このwhere句で戻される各行の既存のOUTAGE_ID値を認識し、既存のステータス・フィールド= 'X'の場合はOUTAGE_IDを「new_val」に更新します。 – tbone

0

ただ、このクエリを使用します。

UPDATE MED_COM_MAPPER_CMDS SET STATUS=? WHERE CMD_ID=? 

あなたはそれが条件付きで起こるしたい場合は、下の2つのSQL文のいずれかを使用してPreparedStatementを作成することができます。

final String SQL1 = "UPDATE MED_COM_MAPPER_CMDS SET STATUS=? WHERE CMD_ID=?"; 
final String SQL2 = "UPDATE MED_COM_MAPPER_CMDS SET STATUS=?, OUTAGE_ID=? WHERE CMD_ID=?"; 


Connection connection=DatabaseUtil.getConnection(); 

if(condition) { 
    PreparedStatement statement = connection.prepareStatement(SQL1); 
    statement.setInt(1, Integer.parseInt(status)); 
    statement.setString(2, cmd_id); 
    int i = statement.executeUpdate(); 
} else { 
    statement.setInt(1, Integer.parseInt(status)); 
    statement.setString(2, outage_id); 
    statement.setString(3, cmd_id); 
    int i = statement.executeUpdate(); 
} 

connection.commit(); 
+0

私の質問は明確ではないと思います。条件はクエリを変更するものではありません。同じクエリを使用しますが、outage_idカラムを更新しないでください。 – Hari

+0

それは意味がありません – m0skit0

+0

あなたはどのような解決策を提案しますか?別の方法を書いてください。 – Hari

1

入力値にNULLチェックを追加できます。渡された値がNULLの場合は、すでに値と同じ値に設定します。それ以外の場合は、渡された値に設定します。この例ではOracleのNVLを使用していますが、COALESCEなどを使用することもできます。

UPDATE MED_COM_MAPPER_CMDS SET STATUS=NVL(?, STATUS) WHERE CMD_ID=? 
+0

STATUS列の既存の値を取得するには、 SELECTクエリを実行します。右 ? – Hari

+0

@Hari Nope、tboneの応答と同じです。 – Glenn

+0

それは私が持っていた別の質問に答えました、ありがとう。 –

関連する問題