为什么同一条sql语句在存储过程中执行和单独执行的结果不一样

ffn474672885 2011-11-06 11:22:48
存储过程如下:
create or replace procedure pro_mms_user_month

is

starttime VARCHAR2(14); --定义上个月开始时间
endtime VARCHAR2(14); --定义上个月结束时间
starttimelast VARCHAR2(14); --定义上上个月开始时间
endtimelast VARCHAR2(14); --定义上上个月结束时间
v_sumnewuser varchar2(100); --包月新增用户数(户)

begin
--上个月开始时间
starttime := to_char(last_day(add_months(SYSDATE, -2)) + 1, 'YYYYMMDD');
--上个月结束时间
endtime := to_char(last_day(add_months(SYSDATE, -1)), 'YYYYMMDD');

--上上个月开始时间
starttimelast := to_char(last_day(add_months(SYSDATE, -3)) + 1, 'YYYYMMDD');
--上上个月结束时间
endtimelast := to_char(last_day(add_months(SYSDATE, -2)), 'YYYYMMDD');

--包月新增用户数(户)
select nvl(count(msisdn),0) into v_sumnewuser
from (
select distinct(a.msisdn)
from subscribeinfo a, (select d.serviceid from serviceinfo d where d.type=3) b, chargerate c
where a.serviceid = b.serviceid
and a.CHARGECLASSIDX = c.chargeclassidx
and c.chargemode = 0
and a.state = 1
and a.spid like '35%'
and substr(a.ordertime, 0, 8) >= starttime
and substr(a.ordertime, 0, 8) <= endtime
minus
select distinct(a.msisdn)
from subscribeinfo a, (select d.serviceid from serviceinfo d where d.type=3) b, chargerate c
where a.serviceid = b.serviceid
and a.CHARGECLASSIDX = c.chargeclassidx
and c.chargemode = 0
and a.state = 1
and a.spid like '35%'
and substr(a.ordertime, 0, 8) >= starttimelast
and substr(a.ordertime, 0, 8) <= endtimelast);
insert into debuglog (name,value) values('v_sumnewuser',v_sumnewuser);
commit;
end;
存储过程插入到 debuglog 表中的数据是 v_sumnewuser 值是 59096
debuglog 表达建表语句是:create table DEBUGLOG
(
NAME VARCHAR2(40),
VALUE VARCHAR2(100)
);

但是单独执行:select nvl(count(msisdn),0) as v_sumnewuser

from ( select distinct(a.msisdn)
from subscribeinfo a, (select d.serviceid from serviceinfo d where d.type=3) b, chargerate c
where a.serviceid = b.serviceid
and a.CHARGECLASSIDX = c.chargeclassidx
and c.chargemode = 0
and a.state = 1
and a.spid like '35%'
and substr(a.ordertime, 0, 8) >= to_char(last_day(add_months(SYSDATE, -2)) + 1, 'YYYYMMDD')
and substr(a.ordertime, 0, 8) <= to_char(last_day(add_months(SYSDATE, -1)), 'YYYYMMDD')
minus
select distinct(a.msisdn)
from subscribeinfo a, (select d.serviceid from serviceinfo d where d.type=3) b, chargerate c
where a.serviceid = b.serviceid
and a.CHARGECLASSIDX = c.chargeclassidx
and c.chargemode = 0
and a.state = 1
and a.spid like '35%'
and substr(a.ordertime, 0, 8) >= to_char(last_day(add_months(SYSDATE, -3)) + 1, 'YYYYMMDD')
and substr(a.ordertime, 0, 8) <= to_char(last_day(add_months(SYSDATE, -2)), 'YYYYMMDD'));
得到的 v_sumnewuser 的值是180.这个值是我想要的正确结果。

...全文
1499 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyxlyz 2012-07-20
  • 打赏
  • 举报
回复
在存储过程中用select的话,应该是select into吧
kitsmiler 2012-07-20
  • 打赏
  • 举报
回复 1
告诉你,我也碰到这样的问题,我遇到的问题原因是,表字段是char(10),而传入的参数是varchar2。所以必须加上rtrim(字段)进行处理,不然直接进行比较的话,是得不到结果的,很悲剧吧。。
ffn474672885 2011-11-08
  • 打赏
  • 举报
回复
和 天梯说的一样 过程中不用变量直接用“to_char(last_day(add_months(SYSDATE, -3)) + 1, 'YYYYMMDD')等 代替得到的值就正确了。

但是不知道为什么?

同样的一个存储过程中的语句,只要没有用 minus 取差集的用变量 “starttime” 等 得到的值都是正确的。

搞不懂。

求解答。谢谢上面两位的解答,谢谢。
xiaobn_cn 2011-11-07
  • 打赏
  • 举报
回复
从代码本身没有看出来有什么问题,不过比较奇怪的是楼主为什么要用字符串类型值来存放一个明显是数值类型的内容呢?是否由于用户的原因导致结果不一致呢?比如说直接执行所例用的用户与存储过程的用户访问了不同的表?
yjytiantang 2011-11-07
  • 打赏
  • 举报
回复
过程的语句不要用变量了,都换成一样的,试试~

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧