有一个存储过程,在这个存储过程里面,首先会去读一个表,这个表的一个字段(proname)存储的是一些存储过程的名称,然后循环这个表,根据这个字段(proname)的名称,动态去调用这些存储过程,参数都是一样的。请问如何实现。试过用execute immediate(proname || '(参数)'),但是报了这样一个错:View program sources of error stack;
请高手指点。

解决方案 »

  1.   

    execute immediate('exec ' || proname || '(参数)')
    或者 
    execute immediate(begin ' || proname || '(参数)' || ' end;')
      

  2.   

    v_tmpcomment:=instidlist(i_instloop).instprolink || '(' || v_taskid || ',' || deviceidlist(i_deviceloop) || ',' || instidlist(i_instloop).instid || ',' || instidlist(i_instloop).resultid || ', v_tmpresult,v_tmpcomment)';execute immediate v_tmpcomment;instidlist(i_instloop).instprolink 就是存储过程的名称
      

  3.   

    稍微改了下:
    v_tmpcomment :=
             'begin '
          || instidlist (i_instloop).instprolink
          || '('''
          || v_taskid
          || ''','''
          || deviceidlist (i_deviceloop)
          || ''','''
          || instidlist (i_instloop).instid
          || ''','''
          || instidlist (i_instloop).resultid
          || ''', '''
          || v_tmpresult
          || ''','''
          || v_tmpcomment
          || '''); end;';
      

  4.   

    你好,改成
    v_tmpcomment :=
             'begin '
          || instidlist (i_instloop).instprolink
          || '('''
          || v_taskid
          || ''','''
          || deviceidlist (i_deviceloop)
          || ''','''
          || instidlist (i_instloop).instid
          || ''','''
          || instidlist (i_instloop).resultid
          || ''', '''
          || v_tmpresult
          || ''','''
          || v_tmpcomment
          || '''); end;';
    之后还是不行,另外,最后两个参数: v_tmpresult,v_tmpcomment是需要在子存储过程里面负值后返回的
      

  5.   


    v_sqlstring := 'call ' || procname || '(:pram1, :parm2, :parm3, :parm4, :parm5, :parm6)';
    execute immediate v_sqlstring using v_taskid, deviceidlist (i_deviceloop), instidlist (i_instloop).instid, instidlist (i_instloop).resultid, out v_tmpresult, out v_tmpcomment;换成这样试试
      

  6.   

    改成:
    v_sqlstring := 'call ' || procname || '(:pram1, :parm2, :parm3, :parm4, :parm5, :parm6)';
    execute immediate v_sqlstring using v_taskid, deviceidlist (i_deviceloop), instidlist (i_instloop).instid, instidlist (i_instloop).resultid, out v_tmpresult, out v_tmpcomment;终于解决,非常感谢!