[141204]11G关于使用wmsys.wm_concat的问题

[20141204]11G关于使用wmsys.wm_concat的问题.txt

--今天开发提示一些sql语句在dataguard查询时报错,因为dataguard是read only打开,一些dml语句是不支持的,
--没看语句之前,以为是语句里面使用sequence,仔细检查发现没有,而发现使用了wmsys.wm_concat。
--使用wmsys.wm_concat对象实现行列转换。

--感到奇怪的是在我搭建的测试环境没有问题,能正常执行。
SCOTT@test> @ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- -------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.3.0     Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

SCOTT@test> select wmsys.wm_concat(dname) c60 from dept;
C60
------------------------------------------------------------
ACCOUNTING,RESEARCH,SALES,OPERATIONS,aaa,cc,aaaa

--补充如果使用sequence,出现如下错误。
SCOTT@testdg> SELECT seq1.NEXTVAL FROM dual;
SELECT seq1.NEXTVAL FROM dual
                         *
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-16000: database open for read-only access

SCOTT@testdg> select wmsys.wm_concat(dname) c60 from dept;
C60
------------------------------------------------------------
ACCOUNTING,RESEARCH,SALES,OPERATIONS,aaa,cc,aaaa

--再仔细看提示,很明显要读写临时文件。
XXXX@dg> select wmsys.wm_concat(table_name) from tabs where rownumERROR:
ORA-01157: cannot identify/lock data file 201 - see DBWR trace file
ORA-01110: data file 201: '/u01/app/oracle/oradata/dbcndg/tempfile/temp.304.862160591'
ORA-06512: at "WMSYS.WM_CONCAT_IMPL", line 31
no rows selected

$ ls -l /u01/app/oracle/oradata/dbcndg/tempfile/temp.304.862160591
ls: /u01/app/oracle/oradata/dbcndg/tempfile/temp.304.862160591: No such file or directory

--才发现临时文件没有建立。看来自己工作太不认真。
--然而自己很不理解的是这样的语句即不是排序,如何会使用临时文件呢?

SCOTT@test> desc wmsys.wm_concat
FUNCTION wmsys.wm_concat RETURNS CLOB
Argument Name                  Type                    In/Out Default?
------------------------------ ----------------------- ------ --------
P1                             VARCHAR2                IN

--噢,发现函数的返回类型是CLOB,作为clob保存是使用临时文件的。
--可以查看eygle的链接
http://www.eygle.com/archives/2006/03/lob_and_temporary_tablespace.html

--建立临时文件后,问题解决!
--小插曲
SYS@dbcndg> ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/dbcndg/tempfile/temp.304.862160591' REUSE;
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/dbcndg/tempfile/temp.304.862160591' REUSE
*
ERROR at line 1:
ORA-01537: cannot add file '/u01/app/oracle/oradata/dbcndg/tempfile/temp.304.862160591' - file already part of database

--仔细检查发现tempfile目录没有建立,实际上建立了,11G做dg会自动完成的建立。建立相应目录。
--重启dataguard。检查目录:

$ ls -l /u01/app/oracle/oradata/dbcndg/tempfile/temp.304.862160591
-rw-r----- 1 oracle oinstall 20979712 2014-12-04 12:00:08 /u01/app/oracle/oradata/dbcndg/tempfile/temp.304.862160591

--ok,问题解决。

XXXX@dbcndg> select wmsys.wm_concat(table_name) c60  from tabs where rownumC60
------------------------------------------------------------
AMQC_SYSQ01,AMQC_SYSQ02,ATF_DRUG

XXXX@dbcndg>select s.username, s.sid, u.tablespace, u.contents, u.segtype,    
round(u.blocks*8192/1024/1024,2) MB                               
from v$session s, v$sort_usage u                                  
where s.saddr = u.session_addr                                    
and u.contents = 'TEMPORARY'                                      
order by MB DESC ;        

USERNAME      SID TABLESPACE   CONTENTS  SEGTYPE           MB
------------ ---- ------------ --------- --------- ----------
XXXXXXXX     1264 TEMP         TEMPORARY LOB_DATA           1

--如果两个用户执行类似语句:

XXXX@dbcndg> /
USERNAME                    SID TABLESPACE                      CONTENTS  SEGTYPE           MB
-------------------- ---------- ------------------------------- --------- --------- ----------
SYS                        5030 TEMP                            TEMPORARY LOB_DATA           1
XXXXXXXX                   1264 TEMP                            TEMPORARY LOB_DATA           1

--可以发现这个问题如果大量用户这样执行会大量消耗临时文件,因为临时文件的定义EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;看来应该叫开发停止使用它。
--使用别的方法代替。

--很奇怪的是在10g下,函数wmsys.wm_concat的返回是VARCHAR2。
SYS@test> @http://192.168.100.40/sqllaji/ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- ----------------------------------------------------------------
x86_64/Linux 2.4.xx            10.2.0.4.0     Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi

SYS@test> desc  wmsys.wm_concat
FUNCTION wmsys.wm_concat RETURNS VARCHAR2
Argument Name                  Type                    In/Out Default?
------------------------------ ----------------------- ------ --------
P1                             VARCHAR2                IN

时间: 2024-09-30 21:28:14

[141204]11G关于使用wmsys.wm_concat的问题的相关文章

oracle中WMSYS.WM_CONCAT不出现在12c中解决办法

WMSYS.WM_CONCAT不出现在12c中,原因是WMSYS.WM_CONCAT是一个oracle supported的internal函数,是在oracle workspace manager组件(wmsys用户)中包含的,这个函数是for workspace manager内部使用. 这意味着一般应用程序不建议去调用这个函数,因为这个函数可能会因为版本升级,或者需要优化性能等等其他的原因,oracle开发可以在不通知用户的情况下,修改或者取消这个函数. 所以不建议在application

[20160806]12c 与 WMSYS.WM_CONCAT.txt

[20160806]12c 与 WMSYS.WM_CONCAT.txt --前几天有人问临时表空间消耗的问题,链接: http://www.itpub.net/thread-2065053-1-1.html --我提到11g的wmsys.wm_concat也会使用临时表空间. --链接:http://blog.itpub.net/267265/viewspace-1356256/ --但是在12c测试发现12c已经不存在WMSYS.WM_CONCAT,看来要建议开发不要在使用它连接字符串. --

oracle 函数 WMSYS.WM_CONCAT 的用法 与 mysql 函数GROUP_CONCAT的用法

1.oracle函数 WMSYS.WM_CONCAT的使用 如图,将图1的结果变成图2的结果,使用函数 WMSYS.WM_CONCAT 即可. 查询语句需要配合使用group by select aa,wmsys.wm_concat(t1.name) from ( select t.name,to_char(t.createdate,'yyyy-mm-dd') aa from td_user t where t.td_conference_id = 3218 and t.status = 1 a

oracle—SQL技巧之(二)WMSYS.WM_CONCAT函数实现多行记录用逗号拼接在一起_oracle

需求: 目前接触BI系统,由于业务系统的交易记录有很多,常常有些主管需要看到所有的记录情况,但是又不想滚动,想一眼就可以看到所有的,于是就想到了字符串拼接的形式. 解决方案:使用Oracle自带的函数 WMSYS.WM_CONCAT,进行拼接. 函数限制:它的输出不能超过4000个字节. 为了不让SQL出错,又可以满足业务的需求,超过4000个字节的部分,使用"..." 实现SQL如下: 复制代码 代码如下: CREATE TABLE TMP_PRODUCT (PRODUCT_TYPE

[20141212]关于sql_id.txt

[20141212]关于sql_id.txt http://blog.itpub.net/267265/viewspace-1357292/ http://blog.itpub.net/267265/viewspace-1220996/ --昨天别人问一些sql_id计算的问题,实际上我也不懂具体的算法,我给他看了上面的链接. --他问的问题,还是通过例子来说明: SCOTT@test> @ver1 PORT_STRING                    VERSION        BA

Oracle创建WM_CONCAT函数

Oracle创建WM_CONCAT函数 WM_CONCAT这个函数会出错,所以从 11g开始.官方不认可 WM_CONCAT.然后就没这个函数了, 下面就是创建WM_CONCAT这个函数的步骤 第一步: 下载三个文件:owmctab.plb . owmaggrs.plb . owmaggrb.plb 第二步: 用sqlplus登录:CONN SYS/PASS_WORD AS SYSDBA; 一.忘记除SYS.SYSTEM用户之外的用户的登录密码. 用SYS (或SYSTEM)用户登录: CONN

[20111220]listagg 11G的新特性.txt

[20111220]listagg 11G的新特性.txt 显示相关的数据在一行,找到一个站点,总结了N多方法: www.oracle-base.com/articles/misc/StringAggregationTechniques.php 我第一个知道的是:SELECT deptno,       LTRIM(MAX(SYS_CONNECT_BY_PATH(ename,','))       KEEP (DENSE_RANK LAST ORDER BY curr),',') AS empl

11g中利用listagg函数实现自动拼接INSERT语句

本来今天想继续写另一篇外传,但总是熬这么晚不是个事儿,况且今儿北京又输了,恨铁不成钢,堵得慌... 白天工作忙,晚上看娃睡了之后才有一些时间可以随便写一些,总结一下,记录一下,算是让自己内心的各种问题抒发释放一下.碰巧打开电脑,有位测试的同事下午留言问了一个问题,一想干脆今儿休息一下,写篇短小精悍的,更接地气一些的文章,至少还是工作中可以用到的,这位同事的留言是这样, 我怎么从一个表中提取 所有字段 一个表字段太多 我要写insert的语句 一个个粘字段 好费劲... 首先,11.2版本中限制每

PostgreSQL Oracle 兼容性之 - WM_SYS.WM_CONCAT

先吐槽一下Oracle的wm_sys.wm_concat这个函数,为什么只能支持逗号分隔符呢?太老土了. PostgreSQL的string_agg就做得比较只能,可以使用任意字符串作为分隔符. Oracle行转列函数WMSYS.WM_CONCAT的使用实例demo select * from itlife365_course a where name= '张三'; name 课程 score 张三 数学 99 张三 语文 89 张三 英语 93 上面的场景可用WMSYS.WM_CONCAT(a