Oracle没有WM_CONCAT函数的解决办法

转自:http://blog.csdn.net/wenzhongyan/article/details/43149757

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

一.解锁wmsys用户

alter user wmsys account unlock;

二.创建包、包体和函数

以wmsys用户登录数据库,执行下面的命令
[sql] view plain copy
 
  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. /  

三.创建同义词并授权

[sql] view plain copy
 
  1. create public synonym WM_CONCAT_IMPL for wmsys.WM_CONCAT_IMPL  
  2. /  
  3. create public synonym wm_concat for wmsys.wm_concat  
  4. /  
  5.   
  6. grant execute on WM_CONCAT_IMPL to public  
  7. /  
  8. grant execute on wm_concat to public  
  9. /  

posted on 2017-11-28 16:33  小甜瓜安东泥  阅读(4980)  评论(0编辑  收藏  举报