----
--oracle ora-06575: 程序包或函数wm_concat处于无效状态
----
失效原因:版本不支持,wm_concat是oracle的非公开函数,并不鼓励使用,新版本oracle并没有带此函数,需要手工加上。
--首先使用dba账号登录oracle数据库
sqlplus sys/sys as sysdba
--解锁wmsys用户 (可以是你自己定义的用户zhangsan、lisi之类的都可以)
alter user wmsys account unlock;
--并为wmsys用户授权,可根据需要授权,不建议授权所有权限
grant all privileges to wmsys;
--如果不知道wmsys用户的密码,可以修改其密码
alter user wmsys identified by 123456;
--使用wmsys用户登录数据库
conn wmsys/123456
--在wmsys下创建可用的wm_concat函数,直接执行以下语句
--定义类型
create or replace type wm_concat_impl as object
(
curr_str varchar2(32767),
static function odciaggregateinitialize(sctx in out wm_concat_impl) return number,
member function odciaggregateiterate(self in out wm_concat_impl,
p1 in varchar2) return number,
member function odciaggregateterminate(self in wm_concat_impl,
returnvalue out varchar2,
flags in number)
return number,
member function odciaggregatemerge(self in out wm_concat_impl,
sctx2 in wm_concat_impl) return number
);
--定义类型body:
create or replace type body wm_concat_impl
is
static function odciaggregateinitialize(sctx in 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_str is 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_str is not null) then
self.curr_str := self.curr_str || ',' || sctx2.curr_str ;
end if;
return odciconst.success;
end;
end;
--自定义行变列函数:
create or replace function wm_concat(p1 varchar2)
return varchar2 aggregate using wm_concat_impl ;
--创建完成,给其创建同义词及授权,以供其他用户能正常使用。
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;
发表评论