2010年10月14日

[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@xxxxx
> [mailto:pgsql-jp-bounces@xxxxx] 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@xxxxx
> > [mailto:pgsql-jp-bounces@xxxxx]On Behalf Of
> > toshihideka4316@xxxxx
> > Sent: Wednesday, October 13, 2010 10:27 AM
> > To: pgsql-jp@xxxxx
> > 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@xxxxx
> > > [mailto:pgsql-jp-bounces@xxxxx] 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@xxxxx>:
> > > > サーバ、クライアント共に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@xxxxx
> > > 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;
> > > 以上です。
> > >
>
>
>
>

投稿者 xml-rpc : 2010年10月14日 11:27
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/99140
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。