4

古い Oracle コードを PostgreSQL 9.2 に移植しています。Oracle NVL() には何百もの呼び出しがあるため、同等の機能を提供するマッピング関数を作成しました。これは些細なことのはずですが、私にはまったく明らかではない理由で失敗しています。

CREATE OR REPLACE FUNCTION nvl(expr1 text, expr2 text)
  RETURNS text AS
$BODY$
BEGIN
  RETURN COALESCE( expr1, expr2 );
END;
$BODY$
  LANGUAGE plpgsql STRICT IMMUTABLE;

さまざまな入力パラメータ タイプに対して定義された NVL のバリアントがありますが、テストのために、これ以外はすべて削除しました。削除すると不明な関数エラーが発生するため、これが呼び出されていると確信しています。

以下は、このデータベースに対するいくつかのクエリの結果であり、問​​題を示しています。

# select nvl(null, 'N/A');
 nvl 
-----

(1 row)

# select coalesce(nvl(null, 'N/A'), 'ITS STILL NULL???');
     coalesce      
-------------------
 ITS STILL NULL???
(1 row)

上記から、Coalesce はスタンドアローンで正常に機能することがわかりますが、私の機能では機能しません。

私はPostgreSQLのごく最近のバージョンを使用しています:

# select version();
PostgreSQL 9.2.4 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.7 20120
313 (Red Hat 4.4.7-3), 64-bit

手がかりはありますか?

4

2 に答える 2

2

問題は、私の関数が関数定義の最後にSTRICT IMMUTABLE を持っていたことです。元の投稿からは省略しましたが、これらのパラメーターを表示するように編集しました。

STRICT を指定すると、引数の 1 つが null の場合、関数は常に null を返します。この場合、この関数は内部的に null をテストし、適切に応答することが期待されているため、それは望ましくありません。

それは、カット アンド ペーストされたコード テンプレートを、その機能を完全に理解せずに使用した結果です。

于 2013-06-21T04:36:34.220 に答える