我正在编写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'))
然后我得到一个对象表的空行。
这不是过滤器问题,因为两个参数之间存在数据。
答案 0 :(得分:1)
您的应用程序逻辑出错。你的代码会一直循环,直到FETCH找不到任何东西。然后它退出,这意味着返回的值是一个空集(假设result
和v_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;