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

3

如果可能的话,这些琐碎的功能应该用 SQL 语言来实现。您可以获得更好的性能:

创建或替换函数 nvl(expr1 text, expr2 text)
  返回文本为
$身体$
  选择合并($1, $2);
$身体$
  语言 sql;
于 2013-06-22T12:14:17.747 回答
2

问题是我的函数在函数定义的末尾有STRICT IMMUTABLE 。我将其从原始帖子中删除,但已对其进行编辑以显示这些参数。

当参数之一为 null 时,STRICT 导致函数始终返回 null。在这种情况下,我不希望这样,因为这个函数应该在内部测试 null 并做出适当的响应。

这就是我在不完全了解它们的作用的情况下使用剪切和粘贴的代码模板所得到的。

于 2013-06-21T04:36:34.220 回答