请教如何在一个存储过程里面动态调用另外的存储过程 有一个存储过程,在这个存储过程里面,首先会去读一个表,这个表的一个字段(proname)存储的是一些存储过程的名称,然后循环这个表,根据这个字段(proname)的名称,动态去调用这些存储过程,参数都是一样的。请问如何实现。试过用execute immediate(proname || '(参数)'),但是报了这样一个错:View program sources of error stack;请高手指点。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 execute immediate('exec ' || proname || '(参数)')或者 execute immediate(begin ' || proname || '(参数)' || ' end;') 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 就是存储过程的名称 稍微改了下: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_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是需要在子存储过程里面负值后返回的 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;换成这样试试 改成: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;终于解决,非常感谢! 请助:rownum在这里是什么意思? pl/sql developer无法敲入中文 怎么安全可靠移动控制文件? 为什么?数据库全备,却没有备份表空间TEMP dmp文件导入的存储过程实现方法。 新手问题:Oracle 数据如何备份和还原 合并表 请问在哪里可看到dbms_output.put_line的执行结果?(在线等待,得到正确答案立即给分!) 在SQL*PLUS中打开SQL脚本文件出错 关于manager server的问题 ORA-00911 invalid character 如何查找两个数据库user/role的表权限有不一样的
或者
execute immediate(begin ' || proname || '(参数)' || ' end;')
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_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是需要在子存储过程里面负值后返回的
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;换成这样试试
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;终于解决,非常感谢!