我正在将旧的 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
有什么线索吗?