CREATE OR REPLACE VIEW IBS_V_BID_PROJ_LIST AS
SELECT P.PROJID,P.PROJNAME,P.PROJNO,
P.PROJ_ADDITION,U.NAME,(SELECT DISTINCT strCat_HitBider(P.PROJID) FROM IBS_T_BID_NODE_HITBIDRESU) AS BID_UNIT, --项目下所有中标单位P.CURRENCY ||':'||(SELECT SUM(NVL(R.BIDPRICE,0)) FROM IBS_T_BID_NODE_HITBIDRESU R
WHERE R.PROJID = P.PROJID
) AS BID_PRICE --中标金额 FROM IBS_T_BID_PROJ_INFO P
JOIN IBS_T_PUB_USER U ON P.USER_ID=U.USER_ID
ORDER BY P.PROJID DESC
CREATE OR REPLACE FUNCTION "STRCAT_HITBIDER" ( str_in in varchar2 )--分类字段,用‘/’连接某项目各标段下的中标单位
return varchar2
is
str_list varchar2(4000) default null;--连接后字符串
str varchar2(20) default null;--连接符号
begin
for x in ( select C.FULL_NAME from IBS_T_BID_NODE_HITBIDRESU R
JOIN IBS_T_PUB_COMPANY C ON C.COMPANY_ID = R.COMPANY_ID
where R.PROJID = str_in
) loop
str_list := str_list || str || to_char(x.FULL_NAME);
str := '/';
end loop;
return str_list;
end;查询这个视图IBS_V_BID_PROJ_LIST 的时候很慢 就是因为多了BID_UNIT这个字段的原因 注释掉这个字段 不到1秒就出来了,不然要1分多钟,IBS_T_BID_NODE_HITBIDRESU表有两千多数据, IBS_T_BID_PROJ_INFO 有接近两百条 全耗在执行那个函数上了
怎么换个方式处理下啊?
SELECT P.PROJID,P.PROJNAME,P.PROJNO,
P.PROJ_ADDITION,U.NAME,(SELECT DISTINCT strCat_HitBider(P.PROJID) FROM IBS_T_BID_NODE_HITBIDRESU) AS BID_UNIT, --项目下所有中标单位P.CURRENCY ||':'||(SELECT SUM(NVL(R.BIDPRICE,0)) FROM IBS_T_BID_NODE_HITBIDRESU R
WHERE R.PROJID = P.PROJID
) AS BID_PRICE --中标金额 FROM IBS_T_BID_PROJ_INFO P
JOIN IBS_T_PUB_USER U ON P.USER_ID=U.USER_ID
ORDER BY P.PROJID DESC
CREATE OR REPLACE FUNCTION "STRCAT_HITBIDER" ( str_in in varchar2 )--分类字段,用‘/’连接某项目各标段下的中标单位
return varchar2
is
str_list varchar2(4000) default null;--连接后字符串
str varchar2(20) default null;--连接符号
begin
for x in ( select C.FULL_NAME from IBS_T_BID_NODE_HITBIDRESU R
JOIN IBS_T_PUB_COMPANY C ON C.COMPANY_ID = R.COMPANY_ID
where R.PROJID = str_in
) loop
str_list := str_list || str || to_char(x.FULL_NAME);
str := '/';
end loop;
return str_list;
end;查询这个视图IBS_V_BID_PROJ_LIST 的时候很慢 就是因为多了BID_UNIT这个字段的原因 注释掉这个字段 不到1秒就出来了,不然要1分多钟,IBS_T_BID_NODE_HITBIDRESU表有两千多数据, IBS_T_BID_PROJ_INFO 有接近两百条 全耗在执行那个函数上了
怎么换个方式处理下啊?
我认为最好的方式还是就修改你的应用,添加中标信息的时候,就应该形成所有中标单位的连接串,并用额外的字段存储这个信息。
这个可以在应用中实现,也可以用trigger来实现。
最后,你就可以直接查询了,否则总是很慢。还有一个就是:
(SELECT DISTINCT strCat_HitBider(P.PROJID) FROM IBS_T_BID_NODE_HITBIDRESU) AS BID_UNIT, --项目下所有中标单位
把这个语句修改一下
(SELECT strCat_HitBider(P.PROJID) FROM dual) AS BID_UNIT, -
这句话真是神奇啊,非常感谢您!
这样一替换 不到两秒就出来结果了
SELECT DISTINCT strCat_HitBider(P.PROJID) FROM IBS_T_BID_NODE_HITBIDRESU 为什么替换成那样也同样可以,我却不是很懂