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

Tomoaki Sato sato @ sraoss.co.jp
2013年 6月 7日 (金) 15:00:32 JST


佐藤です。

From: "Iwaoka, Yoshinao" <y-iwaoka @ jp.fujitsu.com>
Date: Fri, 7 Jun 2013 00:46:27 +0000

> 具体的に説明させていただきます。
> 
>>> <<環境>>
>>> OS:Linux 
>>> Postgres8.2.10
>>
>>さすがにこれだけだと答えようがないです。
>>
>>具体的にどうやって SQL を実行しようとしているかを教えてもらえますか。例
>>えば、言語とか、API とか、使っているならフレームワークとかです。
>>
>>少なくとも psql や ECPG では文字列内にコロンが含まれていても変数として
>>展開されません。
> 
> 画面系の処理(JAVA)用にPostgresDBアクセス用のAPIを用意している。
> APIは、ECPG(.pgc)で作成している。
> 画面での検索条件を動的SQLで組み立てている。
> (prepare/declare/open cursor/fetch/close cursor)
> 
> 検索する文字列に「:(コロン)」を指定するとエラーとなり、
> シングルコーテーションで括ったら、エラーは発生しなくなったが
> 正しく検索できない状況です。
> 
> 【検索文字列】
> AAA:BBB
> 
> 【修正前】
> Searchbuf='Select a,b,c from table_Z where d = AAA:BBB ' ;
> ⇒DB登録済のコロンを含まない文字列は検索可
> ⇒DB登録済のコロンを含む文字列はエラー発生
> 
> 【修正後】
> Searchbuf='Select a,b,c from table_Z where d = 'AAA:BBB' ' ;
> ⇒DB登録済のコロンを含まない文字列は検索データなし
> ⇒DB登録済のコロンを含む文字列は検索データなし(エラー未発生)
> 
> 【想定】
> コロン(:)でホスト変数と判断してしまっているのか正しく検索できていません。
> 事例等ありましたら、ご教授いただきたい。

ECPG のコードがどうなっているかを教えてもらえますか。

以下のようなコードなら変数 d の値が AAA:BBB でも :BBB は変数として展開
されません。

----
#include <stdio.h>

int
main(int argc, char *argv[])
{
    EXEC SQL BEGIN DECLARE SECTION;
    char *sql = "SELECT a, b, c FROM table_z WHERE d = ?";
    int a, b, c;
    char *d = argv[1];
    EXEC SQL END DECLARE SECTION;

    EXEC SQL CONNECT TO test:5482 USER postgres;
    EXEC SQL PREPARE stmt FROM :sql;
    EXEC SQL DECLARE cursor CURSOR FOR stmt;
    EXEC SQL OPEN cursor USING :d;
    EXEC SQL WHENEVER NOT FOUND DO BREAK;
    while (1)
    {
        EXEC SQL FETCH cursor INTO :a, :b, :c;
        printf("a=%d, b=%d, c=%d\n", a, b, c);
    }
    EXEC SQL CLOSE cursor;
    EXEC SQL COMMIT;
    EXEC SQL DISCONNECT ALL;

    return 0;
}
----


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


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