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

Tomoaki Sato sato @ sraoss.co.jp
2013年 6月 10日 (月) 12:59:33 JST


佐藤です。

> 岩岡です。
> 
> 佐藤様で記述したロジックを同じかと思いますが、以下にロジックを記述し
> ます。
> 
> Connect/Commit/disconnectはSelect_Table_Zの呼び出し側で実行しておりま
> す。「検索文字列=AAA:BB」でSelect_Table_Zを呼び出しております。

うーん、PostgreSQL 8.2 で確認してみましたが、報告のような動作にはならな
いですね。

>> 【修正前】
>> Searchbuf='Select a,b,c from table_Z where d = AAA:BBB ' ;
>> ⇒DB登録済のコロンを含まない文字列は検索可

値を「'」で括らず、「:」が含まれていない場合には、その部分が列名と見な
され、その名前の列がなければエラーになります。

  SELECT a, b, c FROM table_z WHERE d = AAA
  'column "aaa" does not exist' in line xxx.

>> ⇒DB登録済のコロンを含む文字列はエラー発生

値を「'」で括らず、「:」が含まれている場合には、「:」から後の部分がプレー
スホルダと見なされ、USING 句で値を指定していなければエラーになります。

  SELECT a, b, c FROM table_z WHERE d = AAA:BBB
  Too few arguments in line xxx.

>> 【修正後】
>> Searchbuf='Select a,b,c from table_Z where d = 'AAA:BBB' ' ;
>> ⇒DB登録済のコロンを含まない文字列は検索データなし
>> ⇒DB登録済のコロンを含む文字列は検索データなし(エラー未発生)

値を「'」で括っている場合には、「:」が含まれている、含まれていないに係
わらず、その値に一致する行があれば返ってくるはずです。

エラーメッセージを確認していなければ確認するようにしてみてください。

----
EXEC SQL WHENEVER SQLERROR CALL print_sqlerrm();

void
print_sqlerrm()
{
    fprintf(stderr, "%s\n", sqlca.sqlerrm.sqlerrmc);
    exit(1);
}
----

あと、SQL 文を組み立てる場合には、sprintf 関数を使わず、SQL 文の値を埋
め込む場所をプレースホルダに変え、OPEN 文でカーソルを開くときに USING
句で値を埋め込んだほうがいいです。


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


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