有一个存储过程excute_all(id),输入参数为id,
有一个表id_list,我想用select id from id_list的结果作为excue_all的入参,一次性执行多个id,
请问可否通过sql解决。
谢谢!

解决方案 »

  1.   

    如果要用sql,只能把存储过程改为函数,那样就可以直接 select excute_all(id) from id_list
      

  2.   

    不知能否通过游标解决?之前没有接触过。
    初步尝试在程序端用循环依次输入每一个id,比如select id from id_list有800个结果就会进行800次循环,效率很低。
      

  3.   


    看你说要通过一个sql解决你这样做 就不是一个sql,而是pl/sql了
      

  4.   

    可以尝试用集合或游标做参数试试
    另外,你可以把SELECT ID FROM TAB_NAME,放到存储过程里面用游标或集合来接收数据,然后进行相关的业务处理
      

  5.   

    第一步:建存储过程: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> 
      

  6.   


    看你说要通过一个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这样效率很低,程序运行会出现界面假死的现象。请教各位成本和效率比较好的方式。
      

  7.   

    ID如果很多的话,反复调用过程不死才怪呢,同时对数据库的负载也大。如果他们的存储过程不好修改的话,你自己在外面封装一个过程吧,把你所需要的ID 插入到一个临时表中,存储过程读取这个表,在存储过程内部进行循环调用,在存储过程里面调,可以减少程序与数据库之间的IO。从效率上讲,重新修改以前的过程是最好的