在将oracle8i升级到oracle10g后,应用程序的部分视图编译不能通过。提示错误如下:ora-00904: wm_concat:invalid identifier
在将oracle8i升级到oracle10g后,应用程序的部分视图编译不能通过。提示错误如下:
ora-00904: wm_concat:invalid identifier
查询dba_objects视图,也未发现wm_concat的相关信息。
正常情况下查询,,
sql> select * from dba_objects where object_name like 'wm_concat%';
应如下所示:
但在客户系统中,该sql语句返回了0行。
可发现报错的原因,是因为系统从8i升级到10g时,没创建wmsys用户及相关函数。
wm_concat函数在某些场合,还是挺有用的。可以实现将多行数据合并到一行里,以逗号分隔。
一旦该函数异常,应用程序就可能报错。
解决办法:
简单来说,用sqlplus执行下一下几个脚本就可以了。
sql>@$oracle_home\rdbms\admin\owmctab.plb;
sql>@$oracle_home\rdbms\admin\owmaggrs.plb
sql>@$oracle_home\rdbms\admin\owmaggrb.plb
下面我们来做测试,先从系统上删除用户wmsys。
sql> select account_status,wmsys.wm_concat(username) from dba_users group by account_status;
select account_status,wmsys.wm_concat(username) from dba_users group by account_status;
*
第 1 行出现错误:
ora-00904: wmsys.wm_concat: 标识符无效
sql> @d:\oracle\product\10.2.0\db_1\rdbms\admin\owmctab.plb
函数已创建。
授权成功。
pl/sql 过程已成功完成。
授权成功。
过程已创建。
类型已创建。
类型已创建。
pl/sql 过程已成功完成。
表已创建。
索引已创建。
索引已创建。
表已创建。
序列已创建。
表已创建。
序列已创建。
表已创建。
已创建 1 行。
提交完成。
序列已创建。
表已创建。
表已创建。
索引已创建。
表已创建。
已创建 1 行。
类型已创建。
pl/sql 过程已成功完成。
类型已创建。
pl/sql 过程已成功完成。
表已创建。
序列已创建。
表已创建。
已创建 1 行。
已创建 1 行。
已创建 1 行。
已创建 1 行。
已创建 1 行。
已创建 1 行。
已创建 1 行。
提交完成。
表已创建。
表已创建。
类型已创建。
表已创建。
pl/sql 过程已成功完成。
表已创建。
序列已创建。
序列已创建。
序列已创建。
表已创建。
表已创建。
序列已创建。
表已创建。
insert into sys.exppkgact$ values ('lt_export_pkg','sys',1,1000)
*
第 1 行出现错误:
ora-00001: 违反唯一约束条件 (sys.i_actpackage)
insert into sys.exppkgact$ values ('lt_export_pkg','sys',2,1000)
*
第 1 行出现错误:
ora-00001: 违反唯一约束条件 (sys.i_actpackage)
提交完成。
表已创建。
表已创建。
索引已创建。
已创建 1 行。
提交完成。
索引已创建。
表已创建。
表已创建。
已更新 1 行。
提交完成。
表已更改。
pl/sql 过程已成功完成。
表已更改。
表已更改。
表已更改。
已更新 1 行。
提交完成。
索引已创建。
索引已创建。
索引已创建。
索引已创建。
索引已创建。
索引已创建。
索引已创建。
索引已创建。
索引已创建。
pl/sql 过程已成功完成。
索引已创建。
索引已创建。
索引已创建。
已删除0行。
已创建 1 行。
提交完成。
表已创建。
索引已创建。
已更新 1 行。
提交完成。
索引已删除。
索引已创建。
表已创建。
表已更改。
表已更改。
表已创建。
序列已创建。
索引已删除。
索引已创建。
表已更改。
已更新 1 行。
提交完成。
sql> @d:\oracle\product\10.2.0\db_1\rdbms\admin\owmaggrs.plb
类型已创建。
pl/sql 过程已成功完成。
函数已创建。
pl/sql 过程已成功完成。
同义词已创建。
sql> @d:\oracle\product\10.2.0\db_1\rdbms\admin\owmaggrb.plb
类型主体已创建。
sql> select account_status,wmsys.wm_concat(username) from dba_users
2 group by account_status;
account_status
--------------------------------
wmsys.wm_concat(username)
--------------------------------------------------------------------------------
expired & locked
scott,tsmsys,mddata,dip,ordsys,dmsys,ctxsys,xdb,si_informtn_schema,outln,olapsys
,ordplugins,anonymous,wmsys,exfsys,mdsys
open
aaa,wsfx,system,sys,mgmt_view,sysman,dbsnmp,bas,test,admin,testi
以上创建步骤,可恢复wmsys用户的wm_concat函数。
网上有手工创建该函数的脚本,仅将oracle提供的部分脚本,解密出来执行,操作比较麻烦。
我们更推荐使用本文的方法。就像山寨机与品牌机的差别,你懂的!