加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 15:56:43 所属栏目:百科 来源:网络整理
导读:我正在将旧的Oracle代码移植到PostgreSQL 9.2.有几百个对Oracle NVL()的调用,所以我创建了映射函数来提供等效的功能.这个应该是微不足道的,但是由于对我来说根本不明显的原因而失败了. CREATE OR REPLACE FUNCTION nvl(expr1 text,expr2 text) RETURNS text
我正在将旧的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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读