[pgsql-jp: 41440] Re: 動的SQLのコロンの検索について

Tomoaki Sato sato @ sraoss.co.jp
2013年 6月 20日 (木) 22:37:04 JST


佐藤です。

> 岩岡です。
> 
> 返信が遅くなり申し訳ありません。
> 
> ご指摘の通り「Too few arguments in line xxx.」のエラーが返ってきます。
> 
>>値を「'」で括っている場合には、「:」が含まれている、含まれていないに係
>>わらず、その値に一致する行があれば返ってくるはずです。
> 
> 値を「'」で括ってて、正常に検索結果が返ることを確認しました。
> 
> ただ、該当箇所は特殊なことをしてまして、データに「¥」マークがあり、
> 以下のSQLを実行しております。
> 
>>-------------------------------------------------------------------------
> Int Select_Table_Z ( 検索文字列, 検索データ, errcode ) {
> 
> #define L_SQL_FORMAT "SELECT a, b, c FROM table_z WHERE d = $quo$%s$quo$ "
> 
>         EXEC SQL BEGIN DECLARE SECTION;
>                 char hostStatement[1024];
>                 char searchdata1 [1024];
>         EXEC SQL END DECLARE SECTION;
> 
>         Sprint( hostStatement , L_SQL_FORMAT , 検索文字列 );
> 
>         EXEC SQL PREPARE getStatCtlSql FROM :hostStatement;
>         EXEC SQL DECLARE CUR_STATCTL_SELECT CURSOR FOR getStatCtlSql;
>         EXEC SQL OPEN CUR_STATCTL_SELECT;
>         while (テ゛ータ終了まで) {
>                 EXEC SQL FETCH CUR_STATCTL_SELECT
>                 INTO :searchdata1 ;
>                 Memcpy( 検索データ, searchdata1, strlen(searchdata1) );
>         }
>     EXEC SQL CLOSE CUR_STATCTL_SELECT;
> 
>         return(OK)
> }
>>-------------------------------------------------------------------------
> 
> 【修正前】
> #define L_SQL_FORMAT "SELECT a, b, c FROM table_z WHERE d = $quo$%s$quo$ "
> (1)検索文字列=「\」「その他文字列」
>   検索可
> (2)検索文字列=「TEST:TEST」
>   システムエラー発生(Too few arguments in line xxx.)

単一引用符ではなくドル引用符を使っていたのですね。これでやっと原因が分
かりました。

ECPG では、動的 SQL として実行される SQL 文内では単一引用符しか引用符と
して認識されない作りになっており、コロンで始まる文字列はホスト変数とし
て認識されてしまうようです。

> 【修正後】
> #define L_SQL_FORMAT "SELECT a, b, c FROM table_z WHERE d = '$quo$%s$quo$' "
> (1)検索文字列=「\」「その他文字列」「TEST:TEST」
>   検索データなしとなる。

上記の場合には、ドル引用符が検索文字列の一部として認識されてしまうので、
もともと指定していた検索文字列に一致する行は見つかりません。

>>>>>>>>>>>>>>>>>【確認】
> 「コロン」かつ「¥」マークの文字列をwhere句で指定できる事例はありますか?

以前に回答したように、sprintf 関数を使わず、SQL 文の値を埋め込む場所を
プレースホルダに変え、OPEN 文でカーソルを開くときに USING 句で値を埋め
込むようにしてください。

  EXEC SQL PREPARE getStatCtlSql FROM "SELECT a, b, c FROM table_z WHERE d = ?";
  EXEC SQL DECLARE CUR_STATCTL_SELECT CURSOR FOR getStatCtlSql;
  EXEC SQL OPEN CUR_STATCTL_SELECT USING :検索文字列;


----
Tomoaki Sato <sato @ sraoss.co.jp>
SRA OSS, Inc. Japan


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