2008年7月18日

[pgsql-jp: 39503]8.3の"operator does not exist"エラー

こんにちは、海老原です。
8.2以前と8.3の挙動の違いに関する質問です。

次のようなテーブルがあります。
create table test (value integer);

JavaプログラムからJDBC経由でこのテーブルに対し、"DELETE FROM test WHERE value =
?"というSQL文を、パラメータにStringをバインドして実行すると、PostgreSQLバージョンが8.3.3の場合に次のようなサーバーエラーが発生して失敗します。(サーバーログより抜粋)


ERROR: operator does not exist: integer = character varying at character 30
HINT: No operator matches the given name and argument type(s). You
might need to add explicit type casts.
STATEMENT: DELETE FROM test WHERE value = $1

--- Test.java ---
import java.sql.*;

public class Test {
public static void main(String[] args) throws Exception {
Class.forName("org.postgresql.Driver");
String url = "jdbc:postgresql://localhost:5432/postgres";
Connection conn = DriverManager.getConnection(url, "postgres", "");

String sql = "DELETE FROM test WHERE value = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, "999");
ps.executeUpdate();

ps.close();
conn.close();
}
}
-----------

8.2以前ではこのエラーは発生しないので、8.3のリリースノートに記述されている以下の変更が原因のように見えます。

「文字以外のデータ型がTEXTへの自動キャストが行われないようになりました。(Peter, Tom)」
http://www.postgresql.jp/document/current/html/release-8-3.html#AEN86067

ここでイマイチよく分からないのが、psqlから次のDELETE文を実行してもうまくいく点です。

DELETE FROM test WHERE value = '999';

parepare&executeを使っても同じ。

prepare stmt (integer) as DELETE FROM test WHERE value = $1;
execute stmt ('999');

以上のような動作の違いはどのように理解すればよいのでしょうか?
ご存知の方がいれば教えてください。よろしくお願いします。

--
海老原 雄一郎 / EBIHARA, Yuichiro
Email: ebihara@xxxxx


投稿者 xml-rpc : 2008年7月18日 16:39
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/75450
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。