微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql-9.2 – 将Oracle NVL移植到Postgres Coalesce失败

我正在将旧的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

有线索吗?

解决方法

在可能的情况下,这些简单的函数应该用sql语言实现.你可以获得更好的表现:

CREATE OR REPLACE FUNCTION nvl(expr1 text,expr2 text)
  RETURNS text AS
$BODY$
  SELECT coalesce($1,$2);
$BODY$
  LANGUAGE sql;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐