id  funName
1   'fun_add'
2   'fun_sub'
....查询后得到的funName,如何调真正的fun_XXX函数?

解决方案 »

  1.   

    动态SQL
    declare
    temp varchar(50);
    begin
    select funname into temp from test where id=1;
    execute immediate 'select '||temp||'() from dual';
    end 
      

  2.   

    给你的例子:CREATE TABLE FUN_TABLE (FID NUMBER,FUNNAME VARCHAR2(50));
    INSERT INTO FUN_TABLE VALUES(1,'UPDATED_NAME');COMMIT;
    SQL> SELECT * FROM FUN_TABLE;       FID FUNNAME
    ---------- --------------------------------------------------
             1 UPDATED_NAMESQL> SELECT * FROM SUNPING;NAME       PASS       USERADD
    ---------- ---------- ----------
    AAA        11         XF
    BBB        22         MANTIS
    333        33         ORACLE
    444        44         DWH
    555        55         DI-- 要用到的FUNCTION(UPDATED_NAME):
    CREATE OR REPLACE FUNCTION UPDATED_NAME RETURN VARCHAR2 IS
      USERADDNEW VARCHAR2(20);
    BEGIN
      SELECT USERADD
        INTO USERADDNEW
        FROM SUNPING
       WHERE PASS = '33';
      
      RETURN USERADDNEW;
    END;-- 存储过程调用代码:
    CREATE OR REPLACE PROCEDURE GET_FUN_RESULT(FUN_ID IN NUMBER) IS
      CUR_FUN SYS_REFCURSOR;
      FUN_NAME FUN_TABLE.FUNNAME%TYPE;
      V_EXAMPLE VARCHAR2(10);
      
    BEGIN
      SELECT FUNNAME
        INTO FUN_NAME
        FROM FUN_TABLE
       WHERE FID = FUN_ID;
      
      OPEN CUR_FUN FOR 'SELECT '||FUN_NAME||'() FROM DUAL';
      
      FETCH CUR_FUN INTO V_EXAMPLE;
        DBMS_OUTPUT.PUT_LINE('VALUE: '||V_EXAMPLE);
      
      IF CUR_FUN%ISOPEN THEN
      CLOSE CUR_FUN;
      END IF;
      
    END;
    SQL> SELECT UPDATED_NAME() FROM DUAL;UPDATED_NAME()
    --------------------------------------------------------------------------------
    ORACLESQL> EXEC GET_FUN_RESULT(1);VALUE: ORACLEPL/SQL procedure successfully completedSQL> 
      

  3.   

    execute immediate 'select '||函数名||'() from 任意表'
      

  4.   

    sqlstr:='select  '  ||funName||'()  from dual';
    execute immediate sqlstr;