CREATE OR REPLACE PROCEDURE proc_test(
a IN INTEGER,
b IN VARCHAR2,
errnum OUT NUMBER
)
AS
v_form_rec tabletest%ROWTYPE;
retval NUMBER (6);
BEGIN
retval := 0;
DECLARE
CURSOR rowtable_cursor
IS
SELECT * FROM tabletest WHERE id= a AND id_code IN (
SELECT id_code FROM tabletest1 WHERE SUBSTR (idNum, b, 1) = '1')
ORDER BY id;
BEGIN
OPEN rowtable_cursor; FETCH rowtable_cursor
INTO v_form_rec; WHILE (rowtable_cursor%FOUND)
LOOP
//some method
end loop;
end proc_test;
就是说通过传值后的rowtable_cursor中的sql语句放在sql editor里是有数据的,但是放在存储过程中却取不到数据,不能执行loop循环,望达人相助!解决即给分!
a IN INTEGER,
b IN VARCHAR2,
errnum OUT NUMBER
)
AS
v_form_rec tabletest%ROWTYPE;
retval NUMBER (6);
BEGIN
retval := 0;
DECLARE
CURSOR rowtable_cursor
IS
SELECT * FROM tabletest WHERE id= a AND id_code IN (
SELECT id_code FROM tabletest1 WHERE SUBSTR (idNum, b, 1) = '1')
ORDER BY id;
BEGIN
OPEN rowtable_cursor; FETCH rowtable_cursor
INTO v_form_rec; WHILE (rowtable_cursor%FOUND)
LOOP
//some method
end loop;
end proc_test;
就是说通过传值后的rowtable_cursor中的sql语句放在sql editor里是有数据的,但是放在存储过程中却取不到数据,不能执行loop循环,望达人相助!解决即给分!
a IN INTEGER,
b IN VARCHAR2,
errnum OUT NUMBER
)
AS
v_form_rec tabletest%ROWTYPE;
retval NUMBER (6); CURSOR rowtable_cursor
IS
SELECT *
FROM tabletest
WHERE id = a
AND id_code IN (SELECT id_code FROM tabletest1 WHERE SUBSTR (idNum, b, 1) = '1')
ORDER BY id;
BEGIN
retval := 0;
OPEN rowtable_cursor;
LOOP
FETCH rowtable_cursor
INTO v_form_rec; EXIT WHEN rowtable_cursor%NOTFOUND;
//some method
end loop;
close rowtable_cursor;
end proc_test;
SELECT id_code FROM tabletest1 WHERE SUBSTR (idNum, b, 1) = '1')
ORDER BY id;
分步跟踪,到游标这里我将a和b替换成跟踪的值,然后在sql-editor里执行是有数据,而存储过程里却没有得到数据,晕,我的oracle是10g
SELECT id_code FROM tabletest1 WHERE SUBSTR (idNum, 1, 1) = '1')
ORDER BY id;是能查出来值的,但是通过存储过程传值进去游标就查不出来了,???????
注意在循环中必须要执行fetch操作循环才会继续下去;
注意循环退出时v_form_rec为空,如果你是要在循环后取最后一条的某个要素进行操作的话,那么这样的写法永远都取不到值,必须再取一个变量在循环中传递值才行;
oracle10g中类似楼主的语法写存储过程没问题的,我写过n多了,实在不行建议你简化一下操作跟踪一下,或者把建表sql和过程sql都贴出来看看
create table test_001(a number,b number);
insert into test_001 select 1,11 from dual;
insert into test_001 select 1,22 from dual;
commit;
select * from test_001;
create procedure pro_test(x number)
is
cursor cur_test is select b from test_001 where a = x order by b;
v_n1 number;
v_n2 number;
begin
loop
fetch cur_test into v_n1;
exit when cur_test%notfound;
v_n2 := v_n1;
end loop;
insert into test_001 select 2,v_n2 from dual;
commit;
end;
/
execute pro_test(1);
select * from test_001;
create table test_001(a number,b number);
insert into test_001 select 1,11 from dual;
insert into test_001 select 1,22 from dual;
commit;
select * from test_001;
create procedure pro_test(x number)
is
cursor cur_test is select b from test_001 where a = x order by b;
v_n1 number;
v_n2 number;
begin
open
loop cur_test ;
fetch cur_test into v_n1;
exit when cur_test%notfound;
v_n2 := v_n1;
end loop;
close cur_test;
insert into test_001 select 2,v_n2 from dual;
commit;
end;
/
execute pro_test(1);
select * from test_001;
a IN INTEGER,
b IN VARCHAR2,
errnum OUT NUMBER
)
AS
v_form_rec tabletest%ROWTYPE;
retval NUMBER (6);
RefCur IS REF CURSOR;
rowtable_cursor RefCur;
BEGIN
retval := 0;
/*
DECLARE
CURSOR rowtable_cursor
IS
SELECT * FROM tabletest WHERE id= a AND id_code IN (
SELECT id_code FROM tabletest1 WHERE SUBSTR (idNum, b, 1) = '1')
ORDER BY id;
BEGIN
OPEN rowtable_cursor;
*/
OPEN rowtable_cursor FOR 'SELECT * FROM tabletest WHERE id= :a AND id_code IN (' ||
' SELECT id_code FROM tabletest1 WHERE SUBSTR (idNum, :b, 1) = ''1'') ' ||
' ORDER BY id'
USING a, b;
FETCH rowtable_cursor
INTO v_form_rec; WHILE (rowtable_cursor%FOUND)
LOOP
//some method
end loop;
end proc_test;