测试环境是Oracle 10g 10.2.0.4 :
select *
from (select t.*, ROWNUM num
from (select t.user_type,
t.producttype_name,
t.prodname,
t.comcname,
sum(t.cnt) cnt,
sum(t.premium) premium,
cast(WM_CONCAT(policytype || '-' || cnt) as
varchar2(300)) policytype,
cast(WM_CONCAT(status) as varchar2(300)) status,
cast(WM_CONCAT(t.premium) as varchar2(300)) dayPremium,
t.username
from (select u.user_type,
c.comcname,
protype.producttype_name,
product.prodname,
decode(policy.policy_type,
'0',
'0',
'1',
'1',
'2') policytype,
count(POLICYKEY) cnt,
sum(policy.premium) premium,
POLICY_STATUS || PROCESS_STATE status,
u.username
from T_POLICY policy,
T_PRODUCT product,
T_PRODUCT_TYPE protype,
T_USER u,
T_COMPANY c
where policy.product_id = product.product_id
and product.prodtype = protype.producttype_code
and u.usercode = policy.OPERATOR
and c.comcode = policy.MAKE_COM
and policy.CREATE_TIME BETWEEN
to_date('2012-01-01', 'yyyy-MM-dd') and
to_date('2012-04-12' || ' 23:59:59',
'yyyy-MM-dd hh24:mi:ss')
and policy.MAKE_COM in
(select COMCODE
from T_COMPANY
start with COMCODE = '18000000'
connect by prior COMCODE = UPPERCOMCODE)
group by u.user_type,
c.comcname,
protype.producttype_name,
product.prodname,
policy.policy_type,
POLICY_STATUS || PROCESS_STATE,
u.username) t
group by t.user_type,
comcname,
t.producttype_name,
t.prodname,
t.username) t
WHERE ROWNUM <= 15)
WHERE num >= 1
运行这个分页查询没问题
但是在生产环境10.2.0.5上运行报ORA-22922 错误,分析一下原因 就是
cast(WM_CONCAT(policytype || '-' || cnt) as
varchar2(300)) policytype,
cast(WM_CONCAT(status) as varchar2(300)) status,
cast(WM_CONCAT(t.premium) as varchar2(300)) dayPremium 这个WM_CONCAT导致的,这是oracle undocumented的一个列转行的函数,这个函数会把varchar的字段合为lob,但是奇怪的是即使用cast函数强转还是用substr和to_char结合 都解决不了这个问题,有itpub上的朋友自己重写了一个列转行的函数:
create or replace TYPE zh_concat_im
AUTHID CURRENT_USER AS OBJECT
(
CURR_STR VARCHAR2(32767),
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT zh_concat_im) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT zh_concat_im,
P1 IN VARCHAR2) RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATETERMINATE(SELF IN zh_concat_im,
RETURNVALUE OUT VARCHAR2,
FLAGS IN NUMBER)
RETURN NUMBER,
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT zh_concat_im,
SCTX2 IN zh_concat_im) RETURN NUMBER
);
/
create or replace TYPE BODY zh_concat_im
IS
STATIC FUNCTION ODCIAGGREGATEINITIALIZE(SCTX IN OUT zh_concat_im)
RETURN NUMBER
IS
BEGIN
SCTX := zh_concat_im(NULL) ;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEITERATE(SELF IN OUT zh_concat_im,
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 zh_concat_im,
RETURNVALUE OUT VARCHAR2,
FLAGS IN NUMBER)
RETURN NUMBER
IS
BEGIN
RETURNVALUE := CURR_STR ;
RETURN ODCICONST.SUCCESS;
END;
MEMBER FUNCTION ODCIAGGREGATEMERGE(SELF IN OUT zh_concat_im,
SCTX2 IN zh_concat_im)
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 zh_concat(P1 VARCHAR2)
RETURN VARCHAR2 AGGREGATE USING zh_concat_im ;
/
效率不如WM_CONCAT但是还是解决了这个问题,感谢这位网友啊!
分享到:
相关推荐
### Oracle 错误 ORA-00132 和 ORA-00214 解析及处理 #### 一、错误概述 在Oracle数据库管理过程中,遇到ORA-00132和ORA-00214这类错误时,往往意味着数据库配置或启动过程中出现了问题。下面将对这两个错误进行...
Oracle数据库发生ORA-04031错误原因浅析及处理 Oracle数据库是甲骨文公司提供的一种分布式数据库管理系统,以分布式数据库为核心的软件产品。它具有完整的数据管理功能,作为一个关系数据库,它是一个非常实用的...
### Oracle ORA-03113 错误解析及解决方法 #### 一、ORA-03113 错误概述 ORA-03113 是一个较为常见的Oracle错误,通常出现在网络通信出现问题时,具体表现为“end-of-file on communication channel”(通信通道上...
Oracle数据库不同版本间的客户端与服务端的连接问题通常涉及到安全和兼容性配置,这篇文章主要讲述了在Oracle 11g R2客户端尝试连接Oracle 19c服务端时,遇到了两个特定的错误:ORA-28040和ORA-01017,以及如何解决...
### Oracle 10g启动后报ORA-16038错误的解决方法 #### 错误概述 在启动Oracle 10g数据库时遇到ORA-16038错误,该错误通常与归档日志操作有关。具体错误信息为: ``` ORA-16038: log 1 sequence #230 cannot be ...
### ERwin连接Oracle报ORA-01041内部错误,hostdef扩展名不存在的知识点解析 #### 一、问题背景及概述 在使用ERwin数据建模工具连接Oracle数据库时,可能会遇到ORA-01041内部错误提示:“hostdef扩展名不存在”。...
在使用Oracle Data Pump工具IMPDP(Import Data Pump)进行数据导入的过程中,可能会遇到ORA-39002和ORA-39070等错误。本文将针对这些错误的排查方法进行详细介绍,帮助用户理解问题的原因及解决策略。 ### 错误...
在Oracle数据库管理过程中,遇到ORA-12518错误是较为常见的问题之一。此错误通常发生在客户端试图连接到数据库服务器的过程中,当监听器无法将客户端连接顺利地移交给服务器进程或调度进程时触发。本文旨在详细介绍...
然而,在日常运维过程中,我们可能会遇到各种错误,比如“ORA-00702”就是其中之一。这个错误通常在尝试重启Oracle数据库服务时出现,意味着数据库实例在启动过程中遇到了问题。本文将详细介绍如何在Windows和Linux...
当尝试使用Kettle连接Oracle 12c时,可能会遇到错误"ORA-28040:没有匹配的验证协议"。这个错误通常意味着客户端和服务器之间的安全认证不兼容。 **ORA-28040错误的解释:** 此错误通常出现在Oracle数据库服务器...
关于WIN10系统使用oracle instant client 时候提示ORA-01019错误的解决方案,本方案是配置好环境变量后依然提示ORA-01019错误的解决方案,内附本人制作测试的全过程说明
在创建Oracle数据库连接时遇到的错误ORA-01017和ORA-02063涉及到用户认证问题以及Oracle数据库版本之间的差异处理。ORA-01017错误表示用户名或密码无效,登录被拒绝,而ORA-02063则通常表示在Oracle数据库之间进行...
此错误通常发生在尝试启动或访问Oracle数据库时,系统提示“ORA-01033: Oracle初始化或关闭中”。该错误表明Oracle实例正处于启动或关闭的过程中,未能完成其正常的启动或关闭流程。 #### 二、问题现象 当遇到ora-...
### ORACLE出现ORA-15414错误 #### 错误概述 在尝试登录Oracle数据库时遇到ORA-15414错误是一种常见的问题。根据提供的描述,“登陆oracle时出现ora-15414时按照文档操作即可安全无压力”,我们可以推测此错误与...
ORA-01033 错误通常出现在尝试启动或连接到Oracle数据库时,表明数据库正处于初始化或关闭过程中。该错误可能由多种原因引起,包括但不限于数据库服务尚未完全启动、系统资源不足或数据库文件损坏等。 #### 解决...
Oracle ORA 异常处理详解 Oracle 是一个强大的关系数据库管理系统,然而,在使用 Oracle 时,总是会遇到各种错误信息,这些错误信息是Oracle抛出的异常信息,用于提示开发者出现了什么问题。了解这些错误信息是...
在Oracle数据库操作过程中,可能会遇到ORA-01460错误,该错误全称为“ORA-01460: 转换请求无法实现或不合理”。这一错误通常发生在数据类型转换或者与操作系统之间的数据交换过程中,特别是在不同字符集之间进行转换...
在Oracle数据库操作过程中,用户可能会遇到一个特定的错误提示——ORA-29275:部分多字节字符。这一错误通常出现在执行查询`SELECT * FROM V$SESSION`时。该错误的出现意味着在查询结果中存在一些多字节字符(通常是...
NULL 博文链接:https://ajita.iteye.com/blog/1725304