求一Oracle包体,包含存储过程,自定义函数(function),自定义类型(table),用函数返回自定义类型(相当于返回一张表)。
  由于ireport不能调用Oracle存储过程,所以需要写一个函数,select  * from table(KPI_QCReport.getAgents());

解决方案 »

  1.   


    供参考:
    CREATE OR REPLACE PACKAGE PACKXINEM8GL IS  TYPE M_REFCURSM IS REF CURSOR;  /************************
      创建单位表,添加单位参数
      ************************/
      PROCEDURE GL_CREATE_COMPANY_PARAMETER(UQCOMPANYID    IN VARCHAR2,
                                            STRDATE        IN VARCHAR2,
                                            UQACCOUNTSETID IN VARCHAR2,
                                            STRISGMROLE    IN VARCHAR2,
                                            STRISFORCE     IN VARCHAR2);  /***********************
      有集团会计期打开月份控制的打开过程
      ***********************/
      PROCEDURE GL_GLGOBALMANAGE_OPEN(UQGlobalPeriodID IN VARCHAR2,
                                      GLGOBALSTATE     IN VARCHAR2);
    FUNCTION GetRecord(a_in number) return M_REFCURSM;   
    END PACKXINEM8GL;
    /
    CREATE OR REPLACE PACKAGE BODY PACKXINEM8GL IS  
      PROCEDURE GL_CREATE_COMPANY_PARAMETER(UQCOMPANYID    IN VARCHAR2,
                                            STRDATE        IN VARCHAR2,
                                            UQACCOUNTSETID IN VARCHAR2,
                                            STRISGMROLE    IN VARCHAR2,
                                            STRISFORCE     IN VARCHAR2) IS    STRSQL       VARCHAR2(5000);
        COMPID       VARCHAR2(50);
        STRGPDATE    VARCHAR2(50);
        STRYEARMONTH VARCHAR2(50); --启用年月    GLPCOUNT   NUMBER; --全局会计期记录数
        V_ACCCOUNT NUMBER; --科目表数据个数
        V_PCCOUNT  NUMBER; --利润中心表数据个数
        V_CCCOUNT  NUMBER; --成本中心表数据个数    STRTABLE VARCHAR2(100);
        EX1 Exception;
        EX2 Exception;    CURSOR V_CUR1 IS
          SELECT VARVALUE, UQCOMPANYID
            FROM TGL_COMPANY_PARAMETERS
           WHERE VARCODE = '2002'
           ORDER BY VARVALUE;
        V_SQL1      VARCHAR2(32767);
        V_SQL2      VARCHAR2(32767);
        V_SQL3      VARCHAR2(32767);
        V_SQL4      VARCHAR2(32767);
        V_SQL5      VARCHAR2(32767);
        V_SQL6      VARCHAR2(32767);
        V_TABLECODE VARCHAR2(32767);
        V_COMPANYID VARCHAR2(40);
      BEGIN
        STRYEARMONTH := SUBSTR(STRDATE, 1, 4) || SUBSTR(STRDATE, 6, 2);
        --取全局参数中系统启用时间
        SELECT COUNT(*) INTO GLPCOUNT FROM TGL_GLOBAL_PARAMETERS;
        IF GLPCOUNT > 0 THEN
          SELECT VARVALUE
            INTO STRGPDATE
            FROM TGL_GLOBAL_PARAMETERS
           WHERE VARCODE = '1001'
             AND ROWNUM = 1;
        ELSE
          RAISE EX1;
        END IF;
        IF TO_DATE(STRDATE, 'YYYY-MM-DD') < TO_DATE(STRGPDATE, 'YYYY-MM-DD') THEN
          RAISE EX2;
        END IF;    --取最大单位表编号ID
        SELECT COUNT(*) INTO GLPCOUNT FROM TGL_COMPANY_PARAMETERS;
        IF GLPCOUNT > 0 THEN
          SELECT TRIM(TO_CHAR(MAX(VARVALUE) + 1, '0000'))
            INTO COMPID
            FROM TGL_COMPANY_PARAMETERS
           WHERE VARCODE = '2002';
        ELSE
          COMPID := TRIM(TO_CHAR(1, '0000'));
        END IF;  EXCEPTION
        WHEN EX1 THEN
          RAISE_APPLICATION_ERROR(-20001, '全局参数的启用时间没有设置!');
        WHEN EX2 THEN
          RAISE_APPLICATION_ERROR(-20001,
                                  '单位启用时间不能比全局参数的启用时间小!');
        WHEN OTHERS THEN
          RAISE_APPLICATION_ERROR(-20001, '设置单位参数时出错!');  END GL_CREATE_COMPANY_PARAMETER;     /*****************************************************************************************************************************
      ** 过程名:GL_GLGOBALMANAGE_OPEN
      ** 参数 : IN : NUMBERINGID :凭证编号方式ID
      ** 描述:  有集团会计期打开月份控制的打开过程
      /*****************************************************************************************************************************/
      PROCEDURE GL_GLGOBALMANAGE_OPEN(UQGlobalPeriodID IN VARCHAR2,
                                      GLGOBALSTATE     IN VARCHAR2) IS
        CURSOR V_CUR IS
          SELECT UQCOMPANYID
            FROM TGL_COMPANY_PARAMETERS
           WHERE VARCODE = '2001';
        V_NUMS          NUMBER;
        V_COMPANYID     VARCHAR2(40);
        V_COMPANYIDLIST VARCHAR2(2000);
        V_SQL           VARCHAR2(2000);
      BEGIN    OPEN V_CUR;
        LOOP
          FETCH V_CUR
            INTO V_COMPANYID;
          EXIT WHEN V_CUR%NOTFOUND;      SELECT COUNT(TCP.INTSTATE)
            INTO V_NUMS
            FROM TGL_COMPANY_PERIODS TCP
           WHERE TCP.UQCOMPANYID = V_COMPANYID
             AND TCP.INTSTATE = 1;      IF (V_NUMS >= TO_NUMBER(GLGOBALSTATE)) THEN
            V_COMPANYIDLIST := V_COMPANYIDLIST || ',''' || V_COMPANYID || '''';
          ELSE
            V_SQL := 'UPDATE TGL_COMPANY_PERIODS CP SET CP.INTSTATE = 1 WHERE CP.UQGLOBALPERIODID = ''' ||
                     UQGlobalPeriodID ||
                     ''' AND CP.INTPROPERTY = 1 AND CP.UQCOMPANYID = ''' ||
                     V_COMPANYID || '''';
            DBMS_OUTPUT.put_line(V_SQL);
            EXECUTE IMMEDIATE V_SQL;      
          END IF;    END LOOP;    CLOSE V_CUR;
      END GL_GLGOBALMANAGE_OPEN;
      /*****************************************************************************************************************************
      ** 函数名:GETGLOBALPARAMETER
      ** 参数 : IN : vCode :全局参数编号
      ** 描述:  获取全局参数信息
      /*****************************************************************************************************************************/
       FUNCTION GetRecord(a_in number) return M_REFCURSM IS
          V_CUR M_REFCURSM ;
       BEGIN
           OPEN V_CUR FOR 'SELECT * FROM T_XL';
           RETURN V_CUR;
       END;
     
    END PACKXINEM8GL;
      

  2.   

    如果在包中定义了cursor类型的变量,那么在包体中该如何实现呢?如::
    以下包声明:
    create or replace package package1 is
    type mycursor is ref cursor;
    procedure findName(stuid in number,stuname out varchar2) ;
    procedure findAll(mycur out mycursor);
    function findAge(stuid in number,stuName out varchar2) return varchar2;
    end;
    该如何实现?