同样一个sql,db2 9.7.8与db2 9.7运行结果不一样.....

[复制链接]
查看11 | 回复9 | 2014-4-5 06:00:12 | 显示全部楼层 |阅读模式
本帖最后由 Nicey_123 于 2014-11-18 15:38 编辑
我这里是想实现类似oracle函数wm_concat功能,
我发现这个语句就是在9.7.8可以,9.7.0不行
select(replace(replace(xml2clob(xmlagg(xmlelement(NAME A,''''||procname||''''||','))),'',''),'',''))
from syscat.PROCEDURES where PROCSchema='SRS' --5841
我对db2 9.7.0的库没有只是做了改了两个参数:
db2 update db cfg using auto_reval DEFERRED_FORCEdb2 update db cfg using decflt_rounding ROUND_HALF_UP
我的环境变量是这样:C:\Documents and Settings\Administrator\桌面\tmp>DB2SET -ALL
[e] DB2PATH=F:\Program Files\IBM\SQLLIB
DB2_DEFERRED_PREPARE_SEMANTICS=NO
DB2_ATS_ENABLE=YES
DB2_COMPATIBILITY_VECTOR=ORA
DB2INSTOWNER=MDAP_MAOWENJUAN
DB2PORTRANGE=60000:60003
DB2INSTPROF=C:\DOCUMENTS AND SETTINGS\ALL USERS\APPLICATION DATA\IBM\DB2\DB2
COPY1
DB2COMM=tcpip
[g] DB2_EXTSECURITY=YES
[g] DB2SYSTEM=MDAP_MAOWENJUAN
[g] DB2PATH=F:\Program Files\IBM\SQLLIB
[g] DB2INSTDEF=DB2
[g] DB2ADMINSERVER=DB2DAS00
不知道是哪里问题呢?感觉改的那两个数据库参数应该没影响啊??、

回复

使用道具 举报

千问 | 2014-4-5 06:00:12 | 显示全部楼层
我已经把参数改回来,把变量DB2_ATS_ENABLE=NO改回来了,还是不能用。。。
回复

使用道具 举报

千问 | 2014-4-5 06:00:12 | 显示全部楼层
select(replace(replace(xml2clob(xmlagg(xmlelement(NAME A,''''||procname||''''||','))),'',''),'',''))
from syscat.PROCEDURES where PROCSchema='SRS' --5841
替换成
SELECT
XMLSERIALIZE(

XMLAGG(

XMLCONCAT(

XMLTEXT( '''' )

,XMLTEXT( PROCNAME )

,XMLTEXT( '''' )

,XMLTEXT( ',' ) ) ) AS VARCHAR( 32000 ) )
FROM
SYSCAT.PROCEDURES
WHERE
PROCSCHEMA = 'SRS'
试一下

回复

使用道具 举报

千问 | 2014-4-5 06:00:12 | 显示全部楼层
本帖最后由 Nicey_123 于 2014-11-18 16:16 编辑
select
xml2clob(xmlagg(xmlelement(NAME A,''''||procname||''''||','))),
replace(xml2clob(xmlagg(xmlelement(NAME A,''''||procname||''''||','))),'','')
from (select procname from syscat.PROCEDURES where PROCSchema='SRS'
fetch first 2 row only);
上面这个sql在9.7.0就不行,replace的时候不出来。。。。。

select replace('''P_SUB_RUN_INDEX'',''P_SUB_RUN_PROC'',','','') from dual
这个sql可以


1.jpg (38.67 KB, 下载次数: 25)
下载附件
2014-11-18 16:16 上传


回复

使用道具 举报

千问 | 2014-4-5 06:00:12 | 显示全部楼层
komicakomica 发表于 2014-11-18 16:05
select(replace(replace(xml2clob(xmlagg(xmlelement(NAME A,''''||procname||''''||','))),'',''),'','' ...

你的sql可以,但是我这个代码是之前的开发人员在9.5基础上开发的,我记得我之前在9.7.0运行过是可以得出结果的,能帮我看一下这个replace有啥问题吗?为啥替换不出来呢?
回复

使用道具 举报

千问 | 2014-4-5 06:00:12 | 显示全部楼层
Nicey_123 发表于 2014-11-18 16:13
select
xml2clob(xmlagg(xmlelement(NAME A,''''||procname||''''||','))),
replace(xml2 ...

我在3L回复的你试过了没有。你给的方法有些复杂,和本没必要加。
回复

使用道具 举报

千问 | 2014-4-5 06:00:12 | 显示全部楼层
komicakomica 发表于 2014-11-18 16:27
我在3L回复的你试过了没有。你给的方法有些复杂,和本没必要加。

你的sql可以,但是我是基于以前的代码。。。。
在xml2clob外面又加一层varchar可以了。。。但是我记得以前用9.7.0的时候是可以的。。不知道为啥这次又不行。。
select
xml2clob(xmlagg(xmlelement(NAME A,''''||procname||''''||','))),
replace(varchar(xml2clob(xmlagg(xmlelement(NAME A,''''||procname||''''||',')))),'P','')
from (select procname from syscat.PROCEDURES
fetch first 2 row only)

回复

使用道具 举报

千问 | 2014-4-5 06:00:12 | 显示全部楼层
本帖最后由 komicakomica 于 2014-11-18 16:47 编辑
Nicey_123 发表于 2014-11-18 16:35
你的sql可以,但是我是基于以前的代码。。。。
在xml2clob外面又加一层varchar可以了。。。但是我记得以 ...

xml2clob现在是不推荐使用了,9.7文档中都看不到有列出。
回复

使用道具 举报

千问 | 2014-4-5 06:00:12 | 显示全部楼层
其他地方也有反映这个问题,说同样是9.7版,测试和生产环境结果不一样,怀疑和实例级别设置有关。帖子没有说原因和解决办法。
回复

使用道具 举报

千问 | 2014-4-5 06:00:12 | 显示全部楼层
本帖最后由 komicakomica 于 2014-11-27 09:26 编辑
9.7.4开始引入了listagg函数,还可以解决最后一项后面多余的分隔符问题,你可以试试。
http://www.db2china.net/club/thread-25045-1-1.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行