如果要用sql,只能把存储过程改为函数,那样就可以直接 select excute_all(id) from id_list
不知能否通过游标解决?之前没有接触过。 初步尝试在程序端用循环依次输入每一个id,比如select id from id_list有800个结果就会进行800次循环,效率很低。
看你说要通过一个sql解决你这样做 就不是一个sql,而是pl/sql了
可以尝试用集合或游标做参数试试 另外,你可以把SELECT ID FROM TAB_NAME,放到存储过程里面用游标或集合来接收数据,然后进行相关的业务处理
第一步:建存储过程:create or replace procedure myproc(mycur sys_refcursor) as type myArrType is table of student%rowtype index by pls_integer; myArr myArrType; begin fetch mycur bulk collect into myArr; for i in myArr.first..myArr.last loop dbms_output.put_line(myArr(i).name || ' : ' || myArr(i).score); end loop; end;第二步:建游标变量SQL> var mycur refcursor; SQL> begin 2 open :mycur for select * from student; 3 end; 4 /PL/SQL procedure successfully completed.第三步:调用SQL> exec myproc(:mycur); a : 7 b : 11 c : 9 d : 30 e : 10 f : 33 g : 51 h : 39 i : 88 j : 46PL/SQL procedure successfully completed.SQL>
看你说要通过一个sql解决你这样做 就不是一个sql,而是pl/sql了 感谢楼上各位的帮助。开始我确实把问题想简单了,我甚至天真的以为可以用形如 exec execute_all(select id from id_list) 的方式解决问题...更详细的描述一下问题: 现在不想修改存储过程,因为过程是第三方提供的,嵌套了过程,尚未完全消化. 存储过程是这样的:execute_all(id) begin execute pro_1(id) execute pro_2(id) execute pro_3(id) end 我现在尝试采取的一个笨办法是利用PB的datawindow取id_list中的id字段,循环for i=1 to rowcount() ls_id=dw_id.getitemstring(i,"id") excute pro_all(ls_id) next这样效率很低,程序运行会出现界面假死的现象。请教各位成本和效率比较好的方式。
初步尝试在程序端用循环依次输入每一个id,比如select id from id_list有800个结果就会进行800次循环,效率很低。
看你说要通过一个sql解决你这样做 就不是一个sql,而是pl/sql了
另外,你可以把SELECT ID FROM TAB_NAME,放到存储过程里面用游标或集合来接收数据,然后进行相关的业务处理
as
type myArrType is table of student%rowtype index by pls_integer;
myArr myArrType;
begin
fetch mycur bulk collect into myArr;
for i in myArr.first..myArr.last loop
dbms_output.put_line(myArr(i).name || ' : ' || myArr(i).score);
end loop;
end;第二步:建游标变量SQL> var mycur refcursor;
SQL> begin
2 open :mycur for select * from student;
3 end;
4 /PL/SQL procedure successfully completed.第三步:调用SQL> exec myproc(:mycur);
a : 7
b : 11
c : 9
d : 30
e : 10
f : 33
g : 51
h : 39
i : 88
j : 46PL/SQL procedure successfully completed.SQL>
看你说要通过一个sql解决你这样做 就不是一个sql,而是pl/sql了
感谢楼上各位的帮助。开始我确实把问题想简单了,我甚至天真的以为可以用形如
exec execute_all(select id from id_list)
的方式解决问题...更详细的描述一下问题:
现在不想修改存储过程,因为过程是第三方提供的,嵌套了过程,尚未完全消化.
存储过程是这样的:execute_all(id)
begin
execute pro_1(id)
execute pro_2(id)
execute pro_3(id)
end
我现在尝试采取的一个笨办法是利用PB的datawindow取id_list中的id字段,循环for i=1 to rowcount()
ls_id=dw_id.getitemstring(i,"id")
excute pro_all(ls_id)
next这样效率很低,程序运行会出现界面假死的现象。请教各位成本和效率比较好的方式。