[pgsql-jp: 41419] Re: 動的SQLのコロンの検索について
Iwaoka, Yoshinao
y-iwaoka @ jp.fujitsu.com
2013年 6月 7日 (金) 18:04:01 JST
岩岡です。
佐藤様で記述したロジックを同じかと思いますが、以下にロジックを記述します。
Connect/Commit/disconnectはSelect_Table_Zの呼び出し側で実行しております。
「検索文字列=AAA:BB」でSelect_Table_Zを呼び出しております。
>-------------------------------------------------------------------------
Int Select_Table_Z ( 検索文字列, 検索データ, errcode ) {
#define L_SQL_FORMAT "SELECT a, b, c FROM table_z WHERE d = %s "
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)
}
>-------------------------------------------------------------------------
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
佐藤です。
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 メーリングリストの案内