Итерирование по «таблице» для создания курсора ссылки - PullRequest
1 голос
/ 13 августа 2011

У меня есть несколько старых SP, у которых есть выходные аргументы типа 'table of', как это ...

TYPE tblSAM_DD_TEXT         IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;
TYPE tblSAM_TYPE            IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
TYPE tbl_CONSOLIDATED_ID    IS TABLE OF VARCHAR2(32) INDEX BY BINARY_INTEGER;


PROCEDURE Get_Associated_Unicorns(
    UNIID_IN IN ABC_UNICORNS.UNI_AUTOID%TYPE,
    ID_OUT OUT tbl_CONSOLIDATED_ID,
    SAMDDTEXT_OUT OUT tblSAM_DD_TEXT,
    SAMTYPE_OUT OUT tblSAM_TYPE
);

... Я бы хотел адаптировать существующую обработку так, чтобы прототип sp выглядел следующим образом ...

TYPE t_cursor IS REF CURSOR ;
PROCEDURE Get_Associated_Unicorns(
    UNIID_IN IN ABC_UNICORNS.UNI_AUTOID%TYPE,
    v_cursor OUT t_cursor
);

... так, чтобы кто-то, вызывающий Get_Associated_Unicorns , имел бы указатель ссылки для использования, а не три объекта 'table of'.

Используя Oracle 10g PL / SQL, как я могу адаптировать существующие SP, чтобы я перебрал объекты 'table of', чтобы заполнить курсор ref, который затем является единственным выходным аргументом?

(три аргумента таблицы значений всегда имеют одинаковую длину) .

1 Ответ

1 голос
/ 13 августа 2011

Если вы сначала создаете 3 типа в своей базе данных

CREATE TYPE tblSAM_DD_TEXT         IS TABLE OF VARCHAR2(50);
CREATE TYPE tblSAM_TYPE            IS TABLE OF NUMBER;
CREATE TYPE tbl_CONSOLIDATED_ID    IS TABLE OF VARCHAR2(32);

Затем вы можете обратиться к ним в процедуре

CREATE or REPLACE PROCEDURE Get_Associated_Unicorns 
                                 ( p_tblSAM_DD_TEXT      IN  tblSAM_DD_TEXT
                                  ,p_tblSAM_TYPE         IN  tblSAM_TYPE
                                  ,p_tbl_CONSOLIDATED_ID IN  tbl_CONSOLIDATED_ID
                                  ,pc_refcursor          OUT sys_refcursor)
BEGIN

OPEN pc_refcursor FOR
SELECT tblSAM_DD_TEXT SAM_DD_TEXT
      ,tblSAM_TYPE    SAM_TYPE
      ,tbl_CONSOLIDATED_ID CONSOLIDATED_ID
FROM   (SELECT column_value tblSAM_DD_TEXT
              ,rownum       r1
        FROM   TABLE(p_tblSAM_DD_TEXT))
      ,(SELECT column_value tblSAM_TYPE
              ,rownum       r2
        FROM   TABLE(p_tblSAM_TYPE))
      ,(SELECT column_value tbl_CONSOLIDATED_ID
              ,rownum       r3
        FROM   TABLE(p_tbl_CONSOLIDATED_ID))
WHERE  r1 = r2
AND    r2 = r3;


END;
...