[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 メーリングリストの案内