【疑问】动态SQL中包含的问题

[复制链接]
查看11 | 回复9 | 2010-3-1 11:19:07 | 显示全部楼层 |阅读模式
写的动态SQL中包含如下代码
/*---Group by的字段---*/
mGroupField := 'page_url

,page_pv,page_uniquepv,(page_interval/page_visits)

,(page_jumptimes/page_pv)

,(page_exittimes/page_pv)';
结果在进行测试时,单步调试
单步到这个mGroupFiled的时候,就进行不下去了,始终处于调试的状态,无法终止
难道是这个mGroupFiled的动态SQL字段写错了吗?
哪里出错了?
回复

使用道具 举报

千问 | 2010-3-1 11:19:07 | 显示全部楼层
sqlplus 能运行?
回复

使用道具 举报

千问 | 2010-3-1 11:19:07 | 显示全部楼层
原帖由 〇〇 于 2010-4-6 15:59 发表
sqlplus 能运行?


如果是
mGroupField := 'page_url

,page_pv

,page_uniquepv,(page_interval/page_visits)

,(page_jumptimes/page_pv)

,(page_exittimes/page_pv)';

/*---调用数据分页---*/
page_select.proc_page_select(mTableName,mSQL,mWhere,mGroupField,mCountFiled,

mPageSize,mPageIndex,mOrderField,mOrderStyle,mTotalRecords,mResult);
调试到mGroupField就卡着了,一直编译中
如果我把 mGroupField:= 'page_url';
这样调试就可以继续下去
这也太诡异了吧?
难道是因为中间包含了类似 ,(page_exittimes/page_pv) 这样的有 /的原因?
回复

使用道具 举报

千问 | 2010-3-1 11:19:07 | 显示全部楼层
最好给出全部语句,看不清楚
回复

使用道具 举报

千问 | 2010-3-1 11:19:07 | 显示全部楼层
你确定是卡在赋值这句?
这个东西要放在GROUP BY里面吗?非常怪异,因为这些可能不整除的。
回复

使用道具 举报

千问 | 2010-3-1 11:19:07 | 显示全部楼层
加上四舍五入?
回复

使用道具 举报

千问 | 2010-3-1 11:19:07 | 显示全部楼层
原帖由 newkid 于 2010-4-6 22:59 发表
你确定是卡在赋值这句?
这个东西要放在GROUP BY里面吗?非常怪异,因为这些可能不整除的。


是这样的,原本的SQL是这样的
SELECT page_url AS url,

page_pv AS pv,

page_uniquepv AS uniquepv,

round(page_interval / page_visits, 2) AS avginterval,

100 * round(page_jumptimes / page_pv, 4) AS jumprate,

100 * round(page_exittimes / page_pv, 4) AS exitrate
FROM pd_analy_page
where TRUNC(page_createtime) = sdate
and page_siteid = aiSiteID
group by page_url,

page_pv,

page_uniquepv,

(page_interval / page_visits),

(page_jumptimes / page_pv),

(page_exittimes / page_pv)
然后我准备改造成分页,调用我自己写的一个分页的存储过程
这就是改造的
PROCEDURE proc_content_pageurl(
aiSiteIDIN number, --网站id
mPageSize in number, --每页显示记录数
mPageIndex in number,--当前页
mOrderStyle in number, --排序方式0-升序 1-降序
astrUrl in VARCHAR2, --URL地址
adtStartDate IN VARCHAR2,--起始日期
adtEndDate IN VARCHAR2, --结束日期
mOrderField in varchar2, --排序字段
mTotalRecords out number, --总记录数
mResult out sys_refcursor--记录集
) IS
--sdate date;
--edate date;
mTableName varchar2(50); --表名
mSQL varchar2(1000); --SQL语句
mWhere varchar2(1000); --条件
mGroupField varchar2(50); --Group by字段
mCountFiled varchar2(50); --计算总记录时的Distinct字段
mUrl varchar2(512); --关键字
BEGIN
--sdate:=to_date(adtStartDate,'yyyy-mm-dd');
--edate:=to_date(adtEndDate,'yyyy-mm-dd');

mTableName := 'pd_analy_page';
/*---查询的Select语句---*/
mSQL := ' SELECT page_url AS url

,page_pv AS pv

,page_uniquepv AS uniquepv

,round(page_interval/page_visits,2) AS avginterval

,100*round(page_jumptimes/page_pv,4) AS jumprate

,100*round(page_exittimes/page_pv,4) AS exitrate

FROMpd_analy_page ';
/*---查询的Where条件---*/
mWhere := ' TRUNC(page_createtime) >= to_date('''||adtStartDate||''',''yyyy-mm-dd'')

AND TRUNC(page_createtime)0 then
mUrl := ''''||'%'||astrUrl||'%'||'''';
mWhere := mWhere || ' and page_url like ' || mUrl;
end if;
/*---计算总记录时Distinct的字段---*/
mCountFiled := 'page_url';
/*---Group by的字段---*/
mGroupField := 'page_url

,page_pv

,page_uniquepv,(page_interval/page_visits)

,(page_jumptimes/page_pv)

,(page_exittimes/page_pv)';
/*---调用数据分页---*/
page_select.proc_page_select(mTableName,mSQL,mWhere,mGroupField,mCountFiled,

mPageSize,mPageIndex,mOrderField,mOrderStyle,mTotalRecords,mResult);

END;
我自己写的通用的分页存储过程和函数如下:(附件中是测试数据)
/*----- 获取记录数-----*/
function FUNC_GetCount(mTableName varchar2, mWhere varchar2, mCountFiled varchar2) return number is
i number;
vSql varchar2(1000);
begin
i := 0;
if length(mCountFiled) > 0 then
vSql := 'select count(distinct ' || mCountFiled || ')from ' || mTableName ;
else
vSql := 'select count(*)from ' || mTableName ;
end if;
if length(mWhere) > 0 then
vSql := vSql || ' where ' || mWhere;
end if;
execute IMMEDIATEvSql into i;
return(i);
end;
/*----- 数据分页 ------*/
procedure proc_page_select
(
mTableName in varchar2, --表名
mSQL in varchar2, --SQL语句
mWhere in varchar2,--条件
mGroupField in varchar2, --Group by的字段
mCountFiled in varchar2,
mPageSize in number, --每页显示记录数
mPageIndex in number,--当前页页码
mOrderField in varchar2, --排序字段
mOrderStyle in number, --排序方式0-升序 1-降序
mTotalRecords out number,--总记录数
mResult OUT SYS_REFCURSOR--记录集
) IS
BEGIN
declare
Invalid_Input Exception;
vSql varchar2(1000);
Start_page number;
End_page number;
n_PageIndex number;
n_PageSize number;
begin

--计算总记录数
mTotalRecords := FUNC_GetCount(trim(mTableName), trim(mWhere), trim(mCountFiled));

vSql := mSQL;

--Where条件、Groupby字段、Order字段判断
if length(trim(mWhere)) > 0 then
vSql := vSql || ' where ' || trim(mWhere) ;
end if;

if length(trim(mGroupField)) > 0 then
vSql := vSql || ' Group by ' || trim(mGroupField) ;
end if;

if mOrderField is not null and length(trim(mOrderField)) > 0 then
begin

vSql := vSql || ' order by ' || trim(mOrderField);

if morderStyle > 0 then

vSql := vSql || ' desc ';

end if;
end;
end if;

--判断页面记录数、当前页面
n_PageSize := mPageSize;
if mPageSize0 and n_PageIndex > 1 then
begin

--如果n_pageindex大于实际的页数,则取实际页数

if n_PageIndex > round((mTotalRecords / n_PageSize) + 0.5) then

n_PageIndex := round((mTotalRecords / n_PageSize) + 0.5);

end if;
end;
end if;
Start_page := (n_PageIndex - 1) * n_PageSize + 1;
End_page := n_PageIndex * n_PageSize;
vSql := 'SELECT * FROM (SELECT A.*, rownum r FROM ( ' || vSql || ' ) A WHERE rownum = '|| Start_page;
Open mResult for vSql;
exception
When Invalid_Input Then

open mResult for select null from dual;
end;
END;
回复

使用道具 举报

千问 | 2010-3-1 11:19:07 | 显示全部楼层
单步进入,调试点到红色部分的时候,然后就直接没有单步了,成了如下图的情况,再点单步进入也没用
回复

使用道具 举报

千问 | 2010-3-1 11:19:07 | 显示全部楼层
原帖由 〇〇 于 2010-4-7 06:22 发表
加上四舍五入?

那也没有意义。
楼主的另一贴表明这些东西是SELECT而不是GROUP BY的表达式。
回复

使用道具 举报

千问 | 2010-3-1 11:19:07 | 显示全部楼层
这个咋改造才能让日期作为绑定变量传进去呢
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行