在12C上创建wm_concat函数

Posted 不积小流,无以成江海!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在12C上创建wm_concat函数相关的知识,希望对你有一定的参考价值。

11gr2和12C上已经摒弃了wm_concat函数,当时我们很多程序员在程序中确使用了该函数,导致程序出现错误,为了减轻程序员修改程序的工作量,只有通过手工创建个wm_concat函数,来临时解决该问题,但是注意,及时创建了该函数,在使用的过程中,也需要用to_char(wm_concat())方式,才能完全替代之前的应用。

一.解锁wmsys用户

alter user wmsys account unlock;

二.创建包、包体和函数

以wmsys用户登录数据库,执行下面的命令
  1. CREATE OR REPLACE TYPE WM_CONCAT_IMPL AS OBJECT  
  2. -- AUTHID CURRENT_USER AS OBJECT  
  3. (  
  4. CURR_STR VARCHAR2(32767),   
  5. STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL) RETURN NUMBER,  
  6. MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,  
  7. P1 IN VARCHAR2) RETURN NUMBER,  
  8. MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,  
  9. RETURNVALUE OUT VARCHAR2,  
  10. FLAGS IN NUMBER)  
  11. RETURN NUMBER,  
  12. MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,  
  13. SCTX2 IN WM_CONCAT_IMPL) RETURN NUMBER  
  14. );  
  15. /  
  16.   
  17. --定义类型body:  
  18. CREATE OR REPLACE TYPE BODY WM_CONCAT_IMPL  
  19. IS  
  20. STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT WM_CONCAT_IMPL)  
  21. RETURN NUMBER  
  22. IS  
  23. BEGIN  
  24. SCTX := WM_CONCAT_IMPL(NULL) ;  
  25. RETURN ODCICONST.SUCCESS;  
  26. END;  
  27. MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,  
  28. P1 IN VARCHAR2)  
  29. RETURN NUMBER  
  30. IS  
  31. BEGIN  
  32. IF(CURR_STR IS NOT NULL) THEN  
  33. CURR_STR := CURR_STR || ‘,‘ || P1;  
  34. ELSE  
  35. CURR_STR := P1;  
  36. END IF;  
  37. RETURN ODCICONST.SUCCESS;  
  38. END;  
  39. MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,  
  40. RETURNVALUE OUT VARCHAR2,  
  41. FLAGS IN NUMBER)  
  42. RETURN NUMBER  
  43. IS  
  44. BEGIN  
  45. RETURNVALUE := CURR_STR ;  
  46. RETURN ODCICONST.SUCCESS;  
  47. END;  
  48. MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,  
  49. SCTX2 IN WM_CONCAT_IMPL)  
  50. RETURN NUMBER  
  51. IS  
  52. BEGIN  
  53. IF(SCTX2.CURR_STR IS NOT NULL) THEN  
  54. SELF.CURR_STR := SELF.CURR_STR || ‘,‘ || SCTX2.CURR_STR ;  
  55. END IF;  
  56. RETURN ODCICONST.SUCCESS;  
  57. END;  
  58. END;  
  59. /  
  60. --自定义行变列函数:  
  61. CREATE OR REPLACE FUNCTION wm_concat(P1 VARCHAR2)  
  62. RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ;  
  63. /  

三.创建同义词并授权

    create public synonym WM_CONCAT_IMPL for wmsys.WM_CONCAT_IMPL  
     
    create public synonym wm_concat for wmsys.wm_concat  
    
      
    grant execute on WM_CONCAT_IMPL to public  
    
    grant execute on wm_concat to public  
    

 

 



以上是关于在12C上创建wm_concat函数的主要内容,如果未能解决你的问题,请参考以下文章

oracle 12c 关于wm_concat 的替换;LISTAGG

oracle12 listagg 与 wm_concat行列转换

文本聚合函数(wm_concat, listagg, group_concat, string_agg)

Oracle列转行函数vm_concat在19C版本不兼容解决方案

wm_concat函数

wm_concat函数的排序问题