[pgsql-jp: 40450] Re: 自作関数nvlの挙動について

toshihideka4316 @ zenrin.co.jp toshihideka4316 @ zenrin.co.jp
2010年 10月 15日 (金) 11:28:48 JST


お世話になります。片山です。

スタックトレースの調査はまだ行えていませんが、
調査を進め新たにわかったことがあるので展開させていただきます。

接続文字列にFetch=1000を追加して、SQLを実行した場合は自作のNVL、 COALESCE共に
正常に動作しました。
(APの異常終了なし)
デフォルトでは、設定値がFetch=100である為、以下の現象の「100」と関係あるので
はと考えています。
> 1回のSQL発行で、120行程度のレコードが返却され、100件までがnumeric型で8桁、
> 101件以降がnumeric型で
> 9桁のレコードとなっております。このパターンでレコードが取得できる場合でNVL
を
> 使用している場合のみAPが異常終了します。

予想としては、DeclearFetch=1の場合、最初にFetchで設定された、
レコード数で取得した範囲のレコードで何らかの領域確保を行って処理をしているこ
とが原因ではと考えております。

当情報でなんらかヒントになる情報等ありましたらご提供お願いいたします。

以上で失礼いたします。

> -----Original Message-----
> From: pgsql-jp-bounces @ ml.postgresql.jp 
> [mailto:pgsql-jp-bounces @ ml.postgresql.jp] On Behalf Of 
> Itagaki Takahiro
> Sent: Thursday, October 14, 2010 11:33 AM
> To: PostgreSQL Japanese Mailing List
> Subject: [pgsql-jp: 40449] Re:自作関数nvlの挙動について
> 
> 2010/10/14  <toshihideka4316 @ zenrin.co.jp>:
> > NVLをCOALESCEに変更してAPを実行しましたが、NVL時と同様にAPがログ出力な
しに
> > 異常終了してしまいました。
> 
> ODBC の使い方も含め、AP側のバグである可能性が高いです。
> まずは普通にAPのデバッグをしてみてください。
> 特に、クラッシュした際のスタックトレースが役に立つと思います。
> 
> もしODBC内でクラッシュしているのであれば、ODBCドライバのバグも疑えます。
> DBサーバ側は、本件に関しては十中八九シロでしょう。
> 
> --
> Itagaki Takahiro
> 

> -----Original Message-----
> From: pgsql-jp-bounces @ ml.postgresql.jp 
> [mailto:pgsql-jp-bounces @ ml.postgresql.jp] On Behalf Of 片山 年秀
> Sent: Thursday, October 14, 2010 11:28 AM
> To: pgsql-jp @ ml.postgresql.jp
> Subject: [pgsql-jp: 40448] Re:自作関数nvlの挙動について
> 
>  お世話になります、片山です。
> 
> 質問内容に至らない点があり失礼いたしました。
> 現在サーバ、クライアント共にPostgreSQL8.2.14です。
> 
> 現状では自作関数のNVLはNVL( AAA, -1)の様にNULLをデフォルト値(-1)に置き換え
る
> 用途で使用しております。
> #AAAには8〜9桁の整数が入ります。
> 
> > ソースの修正も辞さないならプログラム中のNVLをCOALESCEに変更
> > してみて下さい。それでもエラーが出るなら、INかOUTのパラメー
> > タ変数の定義に誤りがあると思われます。
> NVLをCOALESCEに変更してAPを実行しましたが、NVL時と同様にAPがログ出力なし
に
> 異常終了してしまいました。
> 
> > これについても、1回のSQLの呼び出しでの取得か、個別のSQL呼び
> > 出しかも判断が付きかねます。
> 1回のSQL発行で、120行程度のレコードが返却され、100件までがnumeric型で8桁、
> 101件以降がnumeric型で
> 9桁のレコードとなっております。このパターンでレコードが取得できる場合でNVL
を
> 使用している場合のみAPが異常終了します。
> #返却されるレコードの100件以内にnumeric型9桁のレコードが含まれる場合は正常
に
> 動作します。
> 
> NVLの改修箇所が多く、
> 現状は、DeclearFetch=0を指定した状態で接続して(ODBC接続)SQLを発行する
方
> 針行くつもりですが、
> エラーが発生するメカニズムが不明である為困っています。
> どなたか、この現象についてご存知のかたがいらっしゃいましたらご教授願いま
す。
> 
> 自作関数のNVLのソースは以下の通りになります。
>> CREATE OR REPLACE FUNCTION nvl(numeric, integer)
>   RETURNS numeric AS
> $BODY$
> declare
>   n_str1 alias for $1;
>   i_str2 alias for $2;
> begin
>   if n_str1 is null then
>     return i_str2;
>   else
>     return n_str1;
>   end if;
> end;
> $BODY$
>   LANGUAGE 'plpgsql' VOLATILE;
> 
> 以上よろしくお願いいたします。
> 
> > -----Original Message-----
> > From: pgsql-jp-bounces @ ml.postgresql.jp 
> > [mailto:pgsql-jp-bounces @ ml.postgresql.jp] On Behalf Of 永浦 英興
> > Sent: Wednesday, October 13, 2010 2:18 PM
> > To: PostgreSQL Japanese Mailing List
> > Subject: [pgsql-jp: 40447] Re:自作関数nvlの挙動について
> > 
> >  最低でもプログラムのソースと、エラーとなった際のNVL関数の
> > 第一引数及び第二引数位は最低でも提示されませんと、無駄なやり
> > 取りが発生し、問題解決が滞ります。
> > 
> > ソースの修正も辞さないならプログラム中のNVLをCOALESCEに変更
> > してみて下さい。それでもエラーが出るなら、INかOUTのパラメー
> > タ変数の定義に誤りがあると思われます。
> > 若しくはPostgreSqlのODBCドライバのバグですかね。
> > 
> > > SQLの取得結果については、numeric(8桁)が100回連続で続き、その後に
> > > numeric(9
> > > 桁)が現れます。
> > これについても、1回のSQLの呼び出しでの取得か、個別のSQL呼び
> > 出しかも判断が付きかねます。
> > 
> > > -----Original Message-----
> > > From: pgsql-jp-bounces @ ml.postgresql.jp 
> > > [mailto:pgsql-jp-bounces @ ml.postgresql.jp]On Behalf Of 
> > > toshihideka4316 @ zenrin.co.jp
> > > Sent: Wednesday, October 13, 2010 10:27 AM
> > > To: pgsql-jp @ ml.postgresql.jp
> > > Subject: [pgsql-jp: 40446] Re:自作関数nvlの挙動について
> > >
> > >
> > >  片山です。お世話になります。
> > >
> > > > 「APが異常終了」だけでは症状が伝わりません。
> > > > 正確なエラーメッセージ(APに返されるもの、DBのログに記録されるもの)
> > > > があると、回答が得やすいと思います。
> > > AP、DBのログ共にエラーメッセージなしでAPが落ちます。
> > > 追加で調査を行ったところ、
> > > DeclearFetch=1を指定した状態で接続し(ODBC接続)、クライントカーソ
ル
>> > > 使
> > > 用して、
> > > SQLを発行するとAPが異常終了することまでわかりました。
> > > SQLの取得結果については、numeric(8桁)が100回連続で続き、その後に
> > > numeric(9
> > > 桁)が現れます。
> > > pgsql等のコンソールツールを用いてSQLを発行した場合は正常に取得できま
す。
> > >
> > > この挙動についてなにかご存知でしたら教えていただけないでしょうか。
> > >
> > > 以上よろしくお願いいたします。
> > >
> > > > -----Original Message-----
> > > > From: pgsql-jp-bounces @ ml.postgresql.jp 
> > > > [mailto:pgsql-jp-bounces @ ml.postgresql.jp] On Behalf Of Itagaki 
> > > > Takahiro
> > > > Sent: Thursday, September 09, 2010 5:48 PM
> > > > To: PostgreSQL Japanese Mailing List
> > > > Subject: [pgsql-jp: 40381] Re:自作関数nvlの挙動について
> > > >
> > > > 2010/9/9  <toshihideka4316 @ zenrin.co.jp>:
> > > > > サーバ、クライアント共にPostgreSQL ver8.2.4を使用しております。
> > > > > nvl(numeric, integer)、nvl(integer, integer)と2つの関数を作成して
使
>> > > し
> > > てお
> > > > > りますが、AP内で自作のnvl(numeric, integer)を使用するとAPが異常終了
す
> > る
> > > 場
> > > 合が
> > > > > あり困っています。
> > > >
> > > > 「APが異常終了」だけでは症状が伝わりません。
> > > > 正確なエラーメッセージ(APに返されるもの、DBのログに記録されるもの)
> > > > があると、回答が得やすいと思います。
> > > >
> > > > --
> > > > Itagaki Takahiro
> > > >
> > >
> > > > -----Original Message-----
> > > > From: 片山 年秀
> > > > Sent: Thursday, September 09, 2010 5:29 PM
> > > > To: pgsql-jp @ ml.postgresql.jp
> > > > Subject: 自作関数nvlの挙動について
> > > >
> > > > 片山です。お世話になります。
> > > > サーバ、クライアント共にPostgreSQL ver8.2.4を使用しております。
> > > > nvl(numeric, integer)、nvl(integer,
> > > > integer)と2つの関数を作成して使用しておりますが、AP内で自作の
> > > nvl(numeric,
> > > > integer)を使用するとAPが異常終了する場合があり困っています。
> > > > (ODBC接続を使用)
> > > > numeric(8桁)を用いてnvl(numeric,
> > > > integer)を100回連続で呼び出した後に、第一引数をnumeric(9桁)でnvl呼び
出
>> > > た
> > > 場合APが異常終了するようです。
> > > > (nvl(integer,integer)を明示的に呼び出すようにSQLを修正すると正常に動
作
>> > > ま
> > > す)
> > > > この挙動についてなにかご存知でしたら教えていただけないでしょうか。
> > > >
> > > > ↓NVLのソース↓
> > > > CREATE OR REPLACE FUNCTION nvl(numeric, integer)
> > > >   RETURNS numeric AS
> > > > $BODY$
> > > > declare
> > > >   n_str1 alias for $1;
> > > >   i_str2 alias for $2;
> > > > begin
> > > >   if n_str1 is null then
> > > >     return i_str2;
> > > >   else
> > > >     return n_str1;
> > > >   end if;
> > > > end;
> > > > $BODY$
> > > >   LANGUAGE 'plpgsql' VOLATILE;
> > > >
> > > >
> > > > CREATE OR REPLACE FUNCTION nvl(integer, integer)
> > > >   RETURNS integer AS
> > > > $BODY$
> > > > declare
> > > >   i_str1 alias for $1;
> > > >   i_str2 alias for $2;
> > > >   ret integer;
> > > > begin
> > > >   if i_str1 is null then
> > > >     ret := i_str2;
> > > >   else
> > > >     ret := i_str1;
> > > >   end if;
> > > >   return ret;
> > > > end;
> > > > $BODY$
> > > >   LANGUAGE 'plpgsql' VOLATILE;
> > > > 以上です。
> > > >
> > 
> > 
> > 
> > 
> 
> 
> 
> 
> 




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