CREATE PACKAGE BODY ABC IS
PROCEDURE ABC AS
 BEGIN
   FOR C IN  
    SELECT SPMC||'('||CSMC||')' a FROM A;
    --  SPMC 过程名称,CSMC 参数名称
    -- 如 a=ABC.ABC(ID)
   LOOP
   ...
   ...
   END LOOP;
  END;
END;想要将游标里的字段a执行出来?

解决方案 »

  1.   


    --给你一个例子:
    --过程中动态调用过程:CREATE OR REPLACE PROCEDURE p_test(rs OUT NUMBER )
    IS
    BEGIN
         SELECT Count(1) INTO rs FROM emp;
    END;
    /CREATE OR REPLACE PROCEDURE test_main
    IS
      v_rs NUMBER;
    BEGIN
        EXECUTE IMMEDIATE 'begin p_test(:v_rs); end;' USING OUT v_rs;
        Dbms_Output.put_line('rs='||v_rs);
    END;
    /EXEC  test_main;
    或者:
    BEGIN
         test_main;
    END;
      

  2.   


    呵呵,一般都是你说的这样,只是今天我有个案子就是要动态调用的,麻烦
    [/Quote]我要实现的就是:第一个过程要通过输入的参数运行出不同的结果;
                    第二个过程通过游标查到过程名和相应的参数名,然后执行,数据在百行左右。
    这样是必须要动态调用么?                
      

  3.   


    --第一个过程要通过输入的参数运行出不同的结果,像这样吗?
    CREATE OR REPLACE PROCEDURE GetInfo (table_name in varchar2,rs out sys_refcursor)
    AS
    BEGIN
     OPEN rs FOR 'select * from '||table_name||' where rownum=1'; --动态游标获取结果集
    END;
    /
    --第二个过程通过游标查到过程名和相应的参数名,然后执行
    --这样也是可以的,就是不知道你如何去查到GetInfo过程?是通过参数去查的吗?
    --不管你怎么样,要获取GetInfo 的结果就要用动态游标来读取
    /
      

  4.   

    对的,只要你动态执行过程所拼接的SQL正确了,应该没问题,执行execute immediate sql;
      

  5.   


    EXECUTE IMMEDIATE 'begin p_test(:v_rs); end;' USING OUT v_rs;你这样的我没试过,我是直接把查到的拼接的结果放到动态SQL里了
    EXECUTE IMMEDIATE V_SQL
    就报错了。
    你告诉我是什么原因么?
      

  6.   

    因为第一个过程是有返回参数的,因此用using out 参数区接收内部返回的动态结果集,同时也要往内层的过程传递一个参数进去,如果你V_SQL=‘过程名(参数)’,这样你的“参数”就不是动态的了啊
    你应该要这样:
    EXECUTE IMMEDIATE 'begin '||过程名||'('||参数||'); end;' using out 参数;
      

  7.   

    PLS-00801:内部错误[22503]
    这是什么错误?