Как сделать обертку, чтобы она возвращала что-то отличное от ref cursor - PullRequest
3 голосов
/ 10 января 2011

У меня есть следующая функция PL SQL, которая возвращает курсор ref, но приложение, которое я использую, не поддерживает курсоры ref. Как я могу заставить этот код возвращать что-то отличное от ref cursor

FUNCTION getADedIcWarningsProv(p_hos_id IN work_entity_data.hos_id%TYPE
                                ,p_date        IN DATE
                                )


RETURN eOdatatypes_package.eOrefcur
  IS

v_refcur eOdatatypes_package.eOrefcur;

BEGIN

OPEN v_refcur FOR
SELECT IF_type IF_type
      ,COUNT(*)       number_infected
FROM (SELECT DISTINCT bd.PT_id             PT_id
                     ,CASE WHEN NVL(O_package.get_O_code_property(pw.warning_code,'Setl'),'N') = 'Y'
                      THEN cd.description
                      ELSE 'Other'
                      END                       IF_type
      FROM PT_ad       pad
          ,BD_details      bd
          ,PT_warnings pw
          ,codes            cd
      WHERE bd.current_record = 'Y'
      AND   bd.BD_location IS NOT NULL
      AND   bd.BD_status IN (SELECT code
                                FROM codes
                               WHERE prog_code IN (1, 1, 2) 
                                 AND code_type = 4)
      AND   bd.AD_no = pad.AD_no
      AND   pad.hos_id = p_hos_id
      AND   pw.PT_id   = bd.PT_id
      AND   pw.warning_to IN ('D','Q')
      AND   p_date BETWEEN pw.applies_start
                       AND NVL(pw.applies_end,p_date)
      AND   NVL(O_package.get_O_code_property(pw.warning_code,'INFT'),'Y') = 'N'
      AND   pw.warning_code = cd.code)
GROUP BY IF_type
ORDER BY IF_type;
RETURN v_refcur;
END getADedIcWarningsProv;

ВЫВОД:

IF_TYPE                           NUMBER_IF
---------------------------------------- ---------------
C                                                 2
M                                                 6
Other                                             4
3 rows selected

1 Ответ

5 голосов
/ 10 января 2011

Вы можете использовать функцию конвейера, чтобы возвращать набор результатов по одной записи за раз, но способом, понятным движку SQL.

create or replace package WrapperSample is

  type TResultRow is record(
     if_type         codes.cd%type
    ,number_infected Integer);

  type TResultRowList is table of TResultRow;

  function GetADedIcWarningsProv
  (
    p_hos_id in work_entity_data.hos_id%type
   ,p_date   in date
  ) return TResultRowList
    pipelined;

end WrapperSample;
/

create or replace package body WrapperSample is

  function GetADedIcWarningsProv
  (
    p_hos_id in work_entity_data.hos_id%type
   ,p_date   in date
  ) return TResultRowList
    pipelined is
    v_refcur   eOdatatypes_package.eOrefcur;
    currentRow TResultRow;
  begin
    v_refcur := YourSchema.getADedIcWarningsProv(p_hos_id, p_date);

    loop
      fetch v_refcur
        INTO currentRow;
      exit when v_refcur%NotFound;
      pipe row(currentRow);
    end loop;

    close v_refcur;

    return;
  end;

end WrapperSample;
/

Используя этот пакет, вы можете выбрать свой курсор ref:

SELECT if_type
      ,number_infected
FROM table(WrapperSample.getADedIcWarningsProv(1, 2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...