FUNCTION F(ID1 IN VARCHAR2, ID2 IN VARCHAR2) RETURN NUMBER IS s_err VARCHAR2(100);
CURSOR cur0 IS SELECT year, COUNT(*) aa FROM 表A WHERE id = ID1 OR id = ID2 GROUP BY year, id;
BEGIN FOR s IN cur0 LOOP BEGIN
IF s.aa > 2 THEN RETURN 2; END IF; END; END LOOP;
RETURN 1;
EXCEPTION WHEN OTHERS THEN s_err := SUBSTR(SQLERRM, 1, 100); RETURN 2;
END F;用游标得出的记录集为 2006 1 2007 2 表A中2006年的记录数为6,2007年的记录数为5。它怎么取得了这样的值? 为什么第一次循环是6,第二次循环是5。
问题应该出在: CURSOR cur0 IS SELECT year, COUNT(*) aa FROM 表A WHERE id = ID1 OR id = ID2 GROUP BY year, id; 你再将值传进去测试一下; 不过在你的函数中,逻辑上好像存在一些问题: 1、函数只能返回最后一个值。你的函数中不论你怎样让它循环,循环完成后你让它的返回值始终是1,因为return 1写在了循环之外,所以为返回值1; 2、个人认为你的需求不需要在函数中加游标,如果没有游标当然也就不需要循环读数据了;你完全只需要写一个固定的SQL查出来放在变量里面,再进行一个判断,再返回值就可以了。
谢谢zgh2003(世纪飞扬) GROUP BY year, id是我拷错了,应该是GROUP BY year。 我是为了测试才没有在循环中根据条件返回值的。 我的需求很简单:就是在表A中查询在每年当中id为1或2的记录数,如果在任何一年中记录数大于2,则返回2;如果每年记录数都为1,则返回1; 就是这个需求。希望再指点一下
FUNCTION F(ID1 IN VARCHAR2) RETURN NUMBER IS S_ERR VARCHAR2(100); v_count number(10);BEGIN SELECT COUNT(*) into v_count FROM 表A WHERE ID = ID1; if v_count>=2 then return 2; else return 1; end if; EXCEPTION WHEN OTHERS THEN S_ERR := SUBSTR(SQLERRM, 1, 100); RETURN 2;
END F;测试: select f(col_id),... from table_name;
已解决,在GROUP BY year 加上having count(*) >1 得出在某一年记录数大于1的,循环游标,能进入游标就返回2,不能说明没有记录数大于1的,就返回1。 再次谢谢zgh2003(世纪飞扬)您的费心关注 真好!散分
IS
s_err VARCHAR2(100);
CURSOR cur0 IS
SELECT year, COUNT(*) aa
FROM 表A
WHERE id = ID1 OR id = ID2
GROUP BY year, id;
BEGIN
FOR s IN cur0 LOOP
BEGIN
IF s.aa > 2 THEN
RETURN 2;
END IF;
END;
END LOOP;
RETURN 1;
EXCEPTION
WHEN OTHERS THEN
s_err := SUBSTR(SQLERRM, 1, 100);
RETURN 2;
END F;用游标得出的记录集为 2006 1
2007 2
表A中2006年的记录数为6,2007年的记录数为5。它怎么取得了这样的值?
为什么第一次循环是6,第二次循环是5。
CURSOR cur0 IS
SELECT year, COUNT(*) aa
FROM 表A
WHERE id = ID1 OR id = ID2
GROUP BY year, id;
你再将值传进去测试一下;
不过在你的函数中,逻辑上好像存在一些问题:
1、函数只能返回最后一个值。你的函数中不论你怎样让它循环,循环完成后你让它的返回值始终是1,因为return 1写在了循环之外,所以为返回值1;
2、个人认为你的需求不需要在函数中加游标,如果没有游标当然也就不需要循环读数据了;你完全只需要写一个固定的SQL查出来放在变量里面,再进行一个判断,再返回值就可以了。
GROUP BY year, id是我拷错了,应该是GROUP BY year。
我是为了测试才没有在循环中根据条件返回值的。
我的需求很简单:就是在表A中查询在每年当中id为1或2的记录数,如果在任何一年中记录数大于2,则返回2;如果每年记录数都为1,则返回1;
就是这个需求。希望再指点一下
S_ERR VARCHAR2(100);
v_count number(10);BEGIN
SELECT COUNT(*) into v_count
FROM 表A
WHERE ID = ID1;
if v_count>=2 then
return 2;
else
return 1;
end if;
EXCEPTION
WHEN OTHERS THEN
S_ERR := SUBSTR(SQLERRM, 1, 100);
RETURN 2;
END F;测试:
select f(col_id),... from table_name;
再次谢谢zgh2003(世纪飞扬)您的费心关注
真好!散分