1

activestate という名前のフィールドを持つ bcfsite という名前のテーブルがあります。

update bcfsite set activestate = 1 where bscname like '%B361Z%'

上記のクエリ SQLPlus または Oracle SQL Developer を実行すると、問題なく正常に動作しますが、次のコードを使用して Java で実行すると、次のようになります。

String sqlstrString = "update bcfsite 
                       set activestate = 0 where bscname like '%B361Z%' ";
PreparedStatement ps = d.prepareStatement(sqlstrString);
ResultSet rs = ps.executeUpdate();

またはこのコード:

ResultSet rs = DBConnection.RunStatement(sqlstrString, d);

私のプログラムは保留され、update ステートメントを渡しません。

テーブルと列を変更し、更新ではなく削除を試みましたが、それでも同じ問題が発生します。

4

3 に答える 3

1

コメントに十分なスペースがないため、これを回答ボックスに入れています...

String qString = "update bcfsite set activestate = 0 where bscname like ?";

これは、置換可能なパラメーターを使用してこれを行う正しい方法です。like 演算子を使用する場合、渡されるものはすべて oracle に関する限り varchar2 であることを忘れないでください。

ps.setString(1,"%B361Z%");

繰り返しますが、これはこれを達成するための正しい方法です。

jdbc 経由で oracle に渡される結果の文字列は次のようになります。

update bcfsite set activestate = 0 where bscname like '%B361Z%'

setString() は正しいマークアップを適用するため、Oracle クエリ パーサーは正しいクエリを認識します。

「?」を含むクエリ それらでは、単に文字列が置き換えられるわけではありません。ステートメントはサーバーによって解析され、パラメーターがサーバーに渡されます。

ところで、これはSOのいくつかの場所で回答されました。SO を検索する方法を学んでください。これにより、応答時間が大幅に短縮され、時間を無駄にすることがなくなります。

于 2015-02-14T18:12:08.777 に答える
0

このアプローチを試してください:

String sqlstrString = "update bcfsite " +
                       "set activestate = 0 where bscname like '?'";
PreparedStatement ps = d.prepareStatement(sqlstrString);
ps.setString(1, "%"+"B361Z"+"%");
ResultSet rs = ps.executeUpdate();

そして、2番目のアプローチは次のようになります。

 ...set activestate=0 where bscname like CONCAT('%', ?, '%')"; 
 ...
 ps.setString(1, "B361Z");
于 2013-03-04T17:38:20.877 に答える
0

最初に次のアプローチを試して、Java コードを介して少なくとも 1 つの行を更新することをクリアできますか?ワイルド文字で単一の行を更新しようとしないでください。

String sqlstrString = "update bcfsite 
                       set activestate = 0 where bscname=?";
PreparedStatement ps = d.prepareStatement(sqlstrString);
ps.setString(1, "B361Z");
ResultSet rs = ps.executeUpdate(); 

これにより、接続/異なるスキーマなどの他の問題が除外される場合があります..

結果を投稿してください。

于 2013-03-04T18:26:10.793 に答える