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. /  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM