よしだです

中村暁史 Nakamura Akifumi <BXQ04723 / nifty.ne.jp> writes:
> しかし微妙にヘンですね。
> cursor.parse("select * from emp where (job) = 'CLERK' ")
> はイケルのに
> cursor.parse("select * from emp where RTRIM(JOB) = :a ")
> cursor.bindrv(":a", "CLERK")
> からRTRIM関数を取ったらイケナイんですね。
> 逆に
> cursor.parse("select * from emp where RTRIM(JOB) = :a ")
> cursor.bindrv(":a", "CLERK    ")
> これがイケルようだし。
> 
> いずれにせよ、このへんの挙動の差って、Ruby側じゃなくて
> Oracleサーバー側の仕様ですよねえ?(^^;

bindrv メソッドでプログラム変数の型を VARCHAR2 にしているせ
いかもしれません。

CHAR 同士の比較では brank-padded comparison が行われて,
VARCHAR2 と CHAR では non-brank-padded comparison が行われる
ようです。

文字列リテラルは CHAR 扱いのようなので brank-padded
comparison  が行われるのでしょう。

したがって以下のように変更するとおそらく期待したように動作す
るのではないでしょうか。

--- oracle.c.org	Thu Jul  1 19:48:37 1999
+++ oracle.c	Tue Nov  9 01:19:23 1999
@@ -492,7 +492,7 @@
   }
   GET_ORACURSOR(obj, cursor);
   err = obndrv(&(cursor->cda), RSTRING(var)->ptr, -1,
-	       progv_ptr, progv_len, 1 /* VARCHAR2 */,
+	       progv_ptr, progv_len, 96 /* CHAR */,
 	       -1, &indp, NULL, -1, -1);
   if (err) {
     oerhms(&(cursor->conn->lda), cursor->cda.rc, buf, sizeof(buf));


副作用があるかどうかは確認していません。

-- 
    吉田正人  INS エンジニアリング(株)
              事業開拓室
    yoshidam / inse.co.jp
    yoshidam / yoshidam.net