select count(*) into var2 from b where b.col2=a.col1;
当然一样了,总是表b的记录数,因为你要它这样的嘛。改一下后,执行一遍:
i:=1
loop
fetch CUR into var1;
select count(*)+i into var2 from b where b.col2=a.col1;
insert into c ( ) values(col1,var2);
i:=i+1;
EXIT when cur%notfound;
end loop;
当然一样了,总是表b的记录数,因为你要它这样的嘛。改一下后,执行一遍:
i:=1
loop
fetch CUR into var1;
select count(*)+i into var2 from b where b.col2=a.col1;
insert into c ( ) values(col1,var2);
i:=i+1;
EXIT when cur%notfound;
end loop;
解决方案 »
- 如何使用触发器限制一个客户端机器最多连接10个session。
- 关于Oracle10G数据导入至另一个用户名下
- ORACLE 10g 安装过程中到85%停止安装 问题! 请高手解答
- Linux下对Oracle进行自动备份
- 我该学什么数据库
- oracle里面这么进行递归查询
- 在SQL Server中,如果排序用倒序时,用desc表示,如order by desc id,在orcale中怎么表示呀?
- oracle中的序列怎么让它重新从1开始记??
- 表空间使用的问题,大家帮忙看看是什么问题
- oracle UTL_HTTP 如何使用问题
- 超级头疼:Oracle => SQL Server
- ██████快救救我啊。在线等待。我被Oracle整惨了。██████
肯定是其他操作有错误
下面这段程序都可以运行(结果也是正确的)
1 declare
2 i integer:=0;
3 begin
4 select count(*) into i from newtest where ncol>0;
5 dbms_output.put_line(i);
6* end;
SQL> /
6PL/SQL 过程已成功完成。
谢谢你指出来,不过这可能是我提炼的予具有问题:原语句应该是:
select count(*) into var2 from b,c where c.col3=b.col4 and b.col2=a.col1;count(*) 的值应该是随着条件a.col1的变化而变化的不好意思,我的过错。
还请再指导一二。。
to:keyset(asdf) 这个语句是没有错误。
打印出的变量也是正确的。
但第二次使用var2的时候,var2得值就可能出错。
在之前的存储过程中,也遇到过这样的第二次引用变量就出错的问题(或者作为条件,或者直接插入一个表中)。我定义了一个中间变量var3,在into var2之后,再用 var3:=var2;
然后用var3,就不会出错了。但这次实验好长时间似乎不管用了。仁兄能提出解决办法吗?
多谢多谢,今天要解决掉他。明天要用啊。
俺是菜鸟,多多指教啊。。
既然你先用了
sql1:='select col1 from a';
open CUR for ssql;
loop
fetch CUR into var1;
估计你是要查每个var1对应的数量
select count(*) into var2 from b,c where c.col3=b.col4 and b.col2=a.col1;
要改为select count(*) into var2 from b,c where c.col3=b.col4 and b.col2=var1
就这一个问题搞了我两天多时间了,心情有些急躁。
大哥多指导。。
做游标取出a.col1的值赋给var1,对应每个var1算出一个统计数赋给var2,
然后存到c表中。
不象会出错的样子。另外insert时最好用insert into c values(var1,var2);这样。
insert into c ( ) values(col1,var2)
commit;--在此处加上该语句即可
EXIT when cur%notfound;
end loop;
close CUR;
2.还有一点修改建议:
fetch CUR into var1;
EXIT when cur%notfound; --最好把此句放在紧跟fetch后面,否则最后一条记录会输出两次
as
cursor t_sor is
select col1 from a;
var2 number;
begin
for v_sor in t_sor loopselect count(*) into var2 from b,c where c.col3=b.col4 and b.col2=v_sor.col1;insert into c values(v_sor.col1,var2);
end loop;
end;
/
应将commit放在loop 循环体外面(即放在end loop 的下一句)
否则在对表锁定操作时会出现问题
但效果还是给原来的一样,如下:
CREATE OR REPLACE PROCEDURE EDU.PROC_SMS_SENT_COUNT2
AS
BEGIN
DECLARE TYPE CUR_REF IS REF CURSOR;
CUR CUR_REF;
datehour varchar2(100);
datehour1 varchar2(100);
ssql varchar(2000); org_id number(6);
c number(2);
d number(2);
tcounter number(8);
tcounter1 number(8);
ggcounter number(8);
ggcounter1 number(8);
cccounter number(8);
cccounter1 number(8);
xxcounter number(8);
xxcounter1 number(8);
bzcounter number(8);
bzcounter1 number(8); tcounter2 number(8);
tcounter12 number(8);
ggcounter2 number(8);
ggcounter12 number(8);
cccounter2 number(8);
cccounter12 number(8);
xxcounter2 number(8);
xxcounter12 number(8);
bzcounter2 number(8);
bzcounter12 number(8);
BEGIN
select floor(sysdate-1-max(attime)) into c from sms_sent_count;
d:=c-1;
for q in reverse 0..d loop
ssql := ' select id from organization where status in (1,3) order by id';-- id=180';
open CUR for ssql;
loop
fetch CUR into org_id;
for p in 1..22 loop
select to_char(sysdate-1-q,'yyyy/mm/dd') into datehour from dual;
select to_char(sysdate-3-q,'yyyy/mm/dd') into datehour1 from dual; if (p<10) then
datehour :=concat(concat(datehour,' 0'),p);
datehour1 :=concat(concat(datehour1,' 0'),p);
else
datehour :=concat(concat(datehour,' '),p);
datehour1 :=concat(concat(datehour1,' '),p);
end if;
select COUNT(*) into tcounter from SMS_SENT_TMP a,message b,person c
where a.msg_id=b.id
and b.creator_id=c.id
and to_char(a.finishdate,'yyyy/mm/dd hh24')=''||datehour||''
and exists ( select p.mobile mobile
from person p, personunit pu,unit u
where p.id=pu.person_id
and c.mobile=p.mobile
and pu.unit_id=u.id
and u.org_id=''||org_id||'');
if (tcounter>0) then -- 如果有下行消息则继续进行 INSERT INTO SMS_SENT_COUNT
(
ID,
ORG_ID,
TOTAL_SENT,
TOTAL_RECED,
GG,
GG1,
CC,
CC1,
XX,
XX1,
BZ,
BZ1,
ATTIME
)
VALUES
(
s_SMS_SENT_COUNT.nextval,
org_id,
tcounter,
0,
0,
0,
0,
0,
0,
0,
0,
0,
to_date(datehour,'yyyy/mm/dd hh24')
); end if;
end loop;
COMMIT;
EXIT when cur%notfound;
end loop;
COMMIT;
close CUR;
end loop;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
rollback;
END;
END;
/
如果ORG_ID为:1,2,3
2 搜索出来的结果TCOUNTER为10
1和3搜索出来的结果TCOUNTER为0
则insert 到SMS_SENT_COUNT表的每个org_id对应的tcounter的值均为10。
老兄及其他兄弟已经帮不少忙了。。
明天,成功与否,都将转分。
253一个先。。
忘了结贴。。并谢keyset(asdf) 兄:
你的方法是可行的。
然后把org_id用个中间变量传送问题就避免了,原来主要问题是发生在fetch CUR into org_id;是的变量传送。。
而我一直专注于对下面这个变量tcounter的检查,测试
select COUNT(*) into tcounter from SMS_SENT_TMP a,message b,person c问题解决了。但原因还不甚明了,因为插入的时候org_id其实是变化了的,只是对应搜出来的
tcounter不变而已,只是加个中间变量就一切ok了。
奇了怪了。。
转分。
并诚挚地感谢各位仁兄。