【发布时间】:2020-08-07 15:49:00
【问题描述】:
我有这个任务来实现一个 Oracle 函数来返回对书籍的搜索。我已经把它全部编码了,但我正在努力弄清楚如何最好地测试这个功能。虽然它作为一个过程可能会更好,但规范需要一个函数。这是我要测试的代码:
FUNCTION SEARCH_BOOK(PI_TITLE_KEYWORD IN TRNG_BOOK.TITLE%TYPE DEFAULT NULL,
PI_PUBLISH_DT_LOWER_BOUND IN TRNG_BOOK.PUBLISH_DT%TYPE DEFAULT NULL,
PI_PUBLISH_DT_UPPER_BOUND IN TRNG_BOOK.PUBLISH_DT%TYPE DEFAULT NULL,
PI_GENRE_NAME IN TRNG_GENRE.GENRE_NM%TYPE DEFAULT NULL)
RETURN SYS_REFCURSOR
IS
PO_RESULT SYS_REFCURSOR;
BEGIN
OPEN PO_RESULT FOR
WITH
LATE_SHIPMENTS_COUNT_LST AS (
SELECT
I.BOOK_ID,
COUNT(*) AS COUNT
FROM
TRNG_ORDR_ITEM I
LEFT OUTER JOIN TRNG_ORDR O ON O.ORDR_ID = I.ORDR_ID
WHERE
EXTRACT(DAY FROM COALESCE(O.SHPMT_TSTP, SYSDATE) - O.ORDR_TSTP) > 2
GROUP BY I.BOOK_ID
)
SELECT
B.BOOK_ID AS BOOK_ID,
B.ISBN AS ISBN,
B.TITLE AS TITLE,
B.PUBLISH_DATE AS PUBLISH_DATE,
B.PUBLISHER_NAME AS PUBLISHER_NAME,
B.COST AS COST,
B.RETAIL_PRICE AS RETAIL_PRICE,
B.GENRE_NAME AS GENRE_NAME,
B.AUTHOR_LIST AS AUTHOR_LIST,
B.TOTAL_QUANTITY_ORDERED AS TOTAL_QUANTITY_ORDERED,
COALESCE(SC.COUNT, 0) AS LATE_SHIPMENTS_COUNT
FROM
TRNG_BOOK_DETAIL_VW B
LEFT OUTER JOIN LATE_SHIPMENTS_COUNT_LST SC ON B.BOOK_ID = SC.BOOK_ID
WHERE
(PI_TITLE_KEYWORD IS NULL OR B.TITLE IN '%' || PI_TITLE_KEYWORD || '%')
AND (PI_PUBLISH_DT_LOWER_BOUND IS NULL OR PI_PUBLISH_DT_LOWER_BOUND < B.PUBLISH_DATE)
AND (PI_PUBLISH_DT_UPPER_BOUND IS NULL OR PI_PUBLISH_DT_UPPER_BOUND > B.PUBLISH_DATE)
AND (PI_GENRE_NAME IS NULL OR B.GENRE_NAME IN '%' || PI_GENRE_NAME || '%');
RETURN PO_RESULT;
END SEARCH_BOOK;
我试图用这个来调用它,它运行没有错误,但没有输出。我想知道......无需花费数小时编写代码,我怎样才能获得某种类型的输出?作为记录,我正在使用 DataGrip。
DECLARE
RESULT SYS_REFCURSOR;
PI_TITLE_KEYWORD VARCHAR2(4000) := NULL ;
PI_PUBLISH_DT_LOWER_BOUND DATE := NULL ;
PI_PUBLISH_DT_UPPER_BOUND DATE := NULL ;
PI_GENRE_NAME VARCHAR2(4000) := NULL ;
BEGIN
RESULT := TRNG_BOOKS.SEARCH_BOOK(
PI_TITLE_KEYWORD => PI_TITLE_KEYWORD,
PI_PUBLISH_DT_LOWER_BOUND => PI_PUBLISH_DT_LOWER_BOUND,
PI_PUBLISH_DT_UPPER_BOUND => PI_PUBLISH_DT_UPPER_BOUND,
PI_GENRE_NAME => PI_GENRE_NAME
);
END;
【问题讨论】: