SQL批量收集和获取

时间:2018-02-18 15:22:25

标签: oracle plsql bulk nested-table

我正在编写PLSQL函数,但是我没有从嵌套表中获取返回数据。这是我的代码,它返回零数据。

set SERVEROUTPUT ON; 

CREATE OR REPLACE FUNCTION GETSummary(startDate DATE, endDate DATE)
RETURN SUM_OBJ_TABLE AS   
                    CURSOR getId   IS
                           SELECT SUM_OBJ (EMP_DATE,
                                  WEEK_ID,
                                  MONTH_ID,
                                  YEAR_ID)

                           FROM ( SELECT 
                                  EMP_DATE,
                                  WEEK_ID,
                                  MONTH_ID,
                                  YEAR_ID

                           FROM EMPLOYEE);
                           WHERE EMP_DATE BETWEEN startDate AND endDate;

           result  SUM_OBJ_TABLE; 

BEGIN     
     OPEN getId;   
  LOOP 
      FETCH getId BULK COLLECT INTO result;

      EXIT WHEN result.COUNT = 0;
      END LOOP;   
     CLOSE getId;   

 RETURN result;    
END;

我已经在同一个数据库上创建了SUM_OBJ AND SUM_OBJECT_TABLE。

该功能运行并编译正常,但是当我做

SELECT * FROM TABLE(GETSUMMARY('2017-06-10','2017-06-16')) 

然后我得到一个对象表的空行。

这不是过滤器问题,因为两个参数之间存在数据。

1 个答案:

答案 0 :(得分:1)

您的应用程序逻辑出错。你的代码会一直循环,直到FETCH找不到任何东西。然后它退出,这意味着返回的值是一个空集(假设resultv_result之间的不一致是一个错字)。

您没有使用LIMIT子句,因此无需使用该循环。鉴于您的光标实际上找到了记录,这将返回它们。

CREATE OR REPLACE FUNCTION GETSummary
    (startDate DATE, endDate DATE)
    RETURN SUM_OBJ_TABLE 
AS   
            CURSOR getId   IS
                   SELECT SUM_OBJ (EMP_DATE,
                          WEEK_ID,
                          MONTH_ID,
                          YEAR_ID)
                   FROM ( SELECT 
                          EMP_DATE,
                          WEEK_ID,
                          MONTH_ID,
                          YEAR_ID
                   FROM EMPLOYEE);
                   WHERE EMP_DATE BETWEEN startDate AND endDate;
      v_result  SUM_OBJ_TABLE; 
BEGIN     
     OPEN getId;   
     FETCH getId BULK COLLECT INTO v_result;
     CLOSE getId;   

   RETURN v_result;    
END;