oracle 11G 不支持 string_agg 函数 解决方案

alexlee 2024-2-27 239 2/27

对于经常开发项目来说,我们是需要经常导库,我是对数据库进行开发,就好比本地是12G的数据库,客户服务器是 11G的数据库,这就会产生相当多的问题了。就好比我们本次要讨论的 这个 string_agg 就会出现问题。

  1. 最近将新开发的功能更新到正式环境上去后,突然间功能就跑不动了,本地运行也确实没有问题。
  2. 对于上边的问题,我们在开发的时候,是不是会经常摸不到头脑,要是没遇见过的人,肯定觉得是没问题的,或是实施在更新的时候,没正常更新。
  3. 那既然问题出现了,我们就不得不想一下,是什么问题,一般来说就会排序程序版本,确认没问题后。要更新的sql也是全部更新了,全部确认后,都没有问题的话。
  4. 接下来,我们就只能通过程序日志来定位,直到发现 string_agg 这个函数不存在,我们才知道,这里报错了。
  5. 此时,我们可能还不知道是因为数据库版本号的差异引起的,我们可能还会反复确认下,这个系统自带的函数,到最后,可能还是不知道问题在哪里。
  6. 那这里我们就总结下,就是数据库版本之间的差异,引起的问题。既然知道了,我们就可以在11G的数据库下边创建 string_agg 这个函数。
CREATE OR REPLACE TYPE t_string_agg AS OBJECT
(
  g_string VARCHAR2(32767),
  STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT t_string_agg)
    RETURN NUMBER,
  MEMBER FUNCTION ODCIAggregateIterate(self IN OUT t_string_agg,
                                       value IN VARCHAR2 )
     RETURN NUMBER,
  MEMBER FUNCTION ODCIAggregateTerminate(self IN t_string_agg,
                                         returnValue OUT VARCHAR2,
                                         flags IN NUMBER)
    RETURN NUMBER,
  MEMBER FUNCTION ODCIAggregateMerge(self IN OUT t_string_agg,
                                     ctx2 IN t_string_agg)
    RETURN NUMBER
);
/
CREATE OR REPLACE TYPE BODY t_string_agg IS
  STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT t_string_agg)
    RETURN NUMBER IS
  BEGIN
    sctx := t_string_agg(NULL);
    RETURN ODCIConst.Success;
  END;
  MEMBER FUNCTION ODCIAggregateIterate(self IN OUT t_string_agg,
                                       value IN VARCHAR2 )
    RETURN NUMBER IS
  BEGIN
    SELF.g_string := self.g_string || ',' || value;
    RETURN ODCIConst.Success;
  END;
  MEMBER FUNCTION ODCIAggregateTerminate(self IN t_string_agg,
                                         returnValue OUT VARCHAR2,
                                         flags IN NUMBER)
    RETURN NUMBER IS
  BEGIN
    returnValue := RTRIM(LTRIM(SELF.g_string, ','), ',');
    RETURN ODCIConst.Success;
  END;
  MEMBER FUNCTION ODCIAggregateMerge(self IN OUT t_string_agg,
                                     ctx2 IN t_string_agg)
    RETURN NUMBER IS
  BEGIN
    SELF.g_string := SELF.g_string || ',' || ctx2.g_string;
    RETURN ODCIConst.Success;
  END;
END;
/
CREATE OR REPLACE FUNCTION string_agg (p_input VARCHAR2)
RETURN VARCHAR2
PARALLEL_ENABLE AGGREGATE USING t_string_agg;

以上是自己的做为资深开发的一些个人经历,把这些经验分享给大家,希望以后大家在从事开发中,可以避免不必要的麻烦,跟浪费时间精力。

要是大家喜欢我的文章的话,可以在文章下留言或是联系我,共同进步,共同探讨开发的一些案例,促进彼此间的交流,分享一些日常的开发趣事。

- THE END -
最后修改:2024年2月27日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论