oracle新版无whconcat函数问题小结

11gr2和12C上已经摒弃了wm_concat函数,但是我们很多程序员在程序中却使用了该函数,导致程序出现错误,为了减轻程序员修改程序的工作量,只有通过手工创建个wm_concat函数,来临时解决该问题。
二. 问题现象
在执行数据库导入过程中,在编译阶段出现如下:
alter  PACKAGE BODY LISAPP.HAND_MONITOR compile;
  LINE/COL ERROR
  319/11 PL/SQL: SQL Statement ignored
  319/18 PL/SQL: ORA-00904: "WM_CONCAT": invalid identifier

手工创建wm_concat函数

1. 解锁wmsys用户

alter user wmsys account unlock;

2. 创建包、包体和函数

以wmsys用户登录数据库,执行下面的命令

sqlplus user/password@pdbname;----连接到那个PDB下。
CREATE OR REPLACE TYPE WM_CONCAT_IMPLAS OBJECT  
-- AUTHID CURRENT_USER AS OBJECT
(
CURR_STR VARCHAR2(32767),
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTXIN OUT WM_CONCAT_IMPL)RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,
P1IN VARCHAR2)RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,
RETURNVALUEOUT VARCHAR2,
FLAGSIN NUMBER)
RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,
SCTX2IN WM_CONCAT_IMPL)RETURN NUMBER  
);
/

3. 定义类型body:

CREATE OR REPLACE TYPE BODY WM_CONCAT_IMPL
IS  
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTXIN OUT WM_CONCAT_IMPL)
RETURN NUMBER  
IS  
BEGIN  
SCTX := WM_CONCAT_IMPL(NULL) ;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT WM_CONCAT_IMPL,
P1 IN VARCHAR2)
RETURN NUMBER
IS
BEGIN  
IF(CURR_STRIS NOT NULL)THEN  
CURR_STR := CURR_STR ||',' || P1;
ELSE
CURR_STR := P1;
END IF;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN WM_CONCAT_IMPL,
RETURNVALUE OUT VARCHAR2,
FLAGS IN NUMBER)
RETURN NUMBER
IS
BEGIN  
RETURNVALUE := CURR_STR ;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT WM_CONCAT_IMPL,
SCTX2 IN WM_CONCAT_IMPL)
RETURN NUMBER
IS
BEGIN  
IF(SCTX2.CURR_STRIS NOT NULL)THEN  
SELF.CURR_STR := SELF.CURR_STR ||',' || SCTX2.CURR_STR ;
END IF;
RETURN ODCICONST.SUCCESS;
END;
END;
/

4. 自定义行变列函数:

CREATE OR REPLACE FUNCTION wm_concat(P1 VARCHAR2) 
RETURN VARCHAR2 AGGREGATE USING WM_CONCAT_IMPL ; 
/

5. 创建同义词并授权

create or replace public synonym WM_CONCAT_IMPL for wmsys.WM_CONCAT_IMPL ; 
create or replace public synonym wm_concat for wmsys.wm_concat ; 
grant execute on WM_CONCAT_IMPL to public ; 
grant execute on wm_concat to public ;
四. 经验小结

注意事项:

  1. 公有同义词—可以被所有数据库用户访问使用scott创建公有同义词

    grant create public synonym to scott—把公有同义词权限赋予给scott

    create public  synonym syn_dept for dept;

  2. 私有同义词create synonym synl for scott.emp;谁创建的同义词,谁使用。

发表评论

登录后才能评论
联系杨振
联系杨振
侵权联系 投诉举报
分享本页
返回顶部