本人有个表tab 有一个字段记录的是存储过程的具体名称,我希望遍历出这个字段,按名称执行存储过程(不存在传参问题)。编译通过,执行时报错:无效的SQL语句。红体字那一行。
CREATE OR REPLACE PROCEDURE SP_LINJIE1 IS
  CURSOR CUR_OPT IS
    SELECT TB_NAME, STATE, T.STATE2, T.PROCEDURE_NAME FROM V_GRSOURCEVST T;
  OPT_VALUE CUR_OPT%ROWTYPE;
BEGIN
  OPEN CUR_OPT;
  LOOP
    FETCH CUR_OPT
      INTO OPT_VALUE;
    CASE
      WHEN OPT_VALUE.STATE = 1 AND OPT_VALUE.STATE2 = 2 THEN
        EXECUTE IMMEDIATE OPT_VALUE.PROCEDURE_NAME;      ELSE
        DBMS_OUTPUT.PUT_LINE('invalid operation');
    END CASE;
    EXIT WHEN CUR_OPT%NOTFOUND;
  END LOOP;
  CLOSE CUR_OPT;
END;

解决方案 »

  1.   


      EXECUTE IMMEDIATE OPT_VALUE.PROCEDURE_NAME;
    --改为
      EXECUTE IMMEDIATE 'begin '||OPT_VALUE.PROCEDURE_NAME||'; end;';
      

  2.   

    EXECUTE IMMEDIATE OPT_VALUE.PROCEDURE_NAME; 
    应该为
    EXECUTE IMMEDIATE 'call '||OPT_VALUE.PROCEDURE_NAME||'()'; 
      

  3.   

    报调用‘过程名’时参数个数或类型错误
    我的过程没有in参数,只有一个out参数,单独执行时不输入参数执行成功。
    而且我刚才查了存储过程的参数标准表示是:
    create [or replace] procedure procedure_name 
    [ (argment [ { in| in out }] type, 
    argment [ { in | out | in out } ] type 
    { is | as } 
    如果说必须有in的话,我确实单独执行成功了。
    但若不给参数又报错。
    搞不懂了?
      

  4.   

    若给了参数的话,会报:
    ORA-06577: 输出参数不是关联变量
    这个更看不懂了。
    网上查到的解决方式是:在输出参数的位置放一个变量就可以了。因为只有在输入参数的位置放一个变量,在过程运行以后,才能将运行结果放到这个变量中,其它程序再从这个变量获取值。
    还是没有解决问题。
      

  5.   

    你这样写试下吧,直接用最简单的测,看有没有问题CREATE OR REPLACE PROCEDURE SP_LINJIE1 IS
      CURSOR CUR_OPT IS
      SELECT TB_NAME, STATE, T.STATE2, T.PROCEDURE_NAME FROM V_GRSOURCEVST T;
      OPT_VALUE CUR_OPT%ROWTYPE;
    BEGIN
      OPEN CUR_OPT;
      LOOP
      FETCH CUR_OPT
      INTO OPT_VALUE;
      
      EXECUTE IMMEDIATE 'begin 此处换成你的其中的存储过程名称; end;';  EXIT WHEN CUR_OPT%NOTFOUND;
      END LOOP;
      CLOSE CUR_OPT;
    END;
      

  6.   

    CREATE OR REPLACE PROCEDURE SP_LINJIE1 IS
      CURSOR CUR_OPT IS
      SELECT TB_NAME, STATE, T.STATE2, T.PROCEDURE_NAME FROM V_GRSOURCEVST T;
      OPT_VALUE CUR_OPT%ROWTYPE;
      vi_out pls_integer;
    BEGIN
      OPEN CUR_OPT;
      LOOP
      FETCH CUR_OPT
      INTO OPT_VALUE;
      
      EXECUTE IMMEDIATE 'begin '|| OPT_VALUE.PROCEDURE_NAME ||'(:1); end;' using out :vi_out;  EXIT WHEN CUR_OPT%NOTFOUND;
      END LOOP;
      CLOSE CUR_OPT;
    END;
      

  7.   

    还是早上有灵感啊!研究出来了!
    关键行的代码写成这样就可以了。
    EXECUTE IMMEDIATE 'declare 
                       val INTEGER;
                       begin '
                       ||OPT_VALUE.PROCEDURE_NAME||
                       '(val); end;'; 
    意思是:
    放置一个和out参数一样的变量在那里,这样在调用过程时,才可以将输出结果存进去,而不会报“参数个数或类型错误”。
    而之前报:“输出参数不是关联变量”,是因为我给的参数类型与调用过程中的out类型不一致(或没有声明,直接写死也是不行的)。谢谢大家,第一次发帖就得到这么多帮助,谢谢。