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

EBIHARA, Yuichiro ebihara @ iplocks.co.jp
2008年 7月 18日 (金) 16:10:47 JST


こんにちは、海老原です。
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 @ iplocks.co.jp



pgsql-jp メーリングリストの案内