Использование переменной BULK COLLECT в процедуре и ссылка на ее столбцы без повторного объявления всего

Я использую массовый сбор для сбора значений из большого набора адресных полей (сокращенных, чтобы сделать код меньше), и я хочу передать эту переменную в другую процедуру в пакете, а затем ссылаться на эти столбцы. Какой тип для процедуры? У меня нормально настроена часть массового сбора, она просто потребляет ее (процедура create_location(part) без необходимости переписывать и переопределять все переменные снова, с которыми у меня проблемы. Или я не могу этого сделать?

procedure create_adrx(
            v_sub_id                                                                in number
        ) AS

            TYPE adrx_info_rectype is RECORD(
                ADRX1                                                               VARCHAR(1000)
                , ADRX2                                                             VARCHAR2(1000)
                , CITY                                                              VARCHAR2(200)
                , COUNTY                                                            VARCHAR2(50)
                , STATE                                                             VARCHAR2(40)
                , ZIP                                                               VARCHAR2(50)
                , SITE_NAME                                                         VARCHAR2(30)
                , GEO_LAT                                                           NUMBER
                , GEO_LONG                                                          NUMBER
            );

            TYPE adrx_info_tbl is TABLE OF adrx_info_rectype;

            adrx_info                                                               adrx_info_tbl;
            v_location_id_result                                                    NUMBER;
            v_party_site_id_result                                                  NUMBER;
            v_account_number_result                                                 NUMBER;

        BEGIN
        
            SELECT
                NVL(sl.ADDRESS1, asi.ADDRESS1)                                      as ADRX1
                , NVL(sl.ADDRESS2, asi.ADDRESS2)                                    as ADRX2
                , NVL(sl.CITY, asi.CITY)                                            as CITY
                , NVL(sl.COUNTY, asi.COUNTY)                                        as COUNTY
                , NVL(sl.STATE, asi.STATE)                                          as STATE
                , NVL(sl.ZIP, asi.ZIP)                                              as ZIP
                , NVL(sl.SITE_NAME, esi.ALT_SITE_NAME)                              as SITE_NAME
                , NVL(sl.LATITUDE, asi.LATITUDE)                                    as GEO_LAT
                , NVL(sl.LONGITUDE, asi.LONGITUDE)                                  as GEO_LONG
            BULK COLLECT INTO
                adrx_info
            FROM
                TBL_SUBS ts
                LEFT JOIN TBL_SUB_LEVEL sl on sl.sub_id = ts.sub_id
                LEFT JOIN TBL_ALT_SUB_LEVEL asl on asl.sub_id = ts.sub_id
                LEFT JOIN TBL_ALT_SITE_INFO asi on asi.ALT_SITE_ID = asl.ALT_SITE_ID
                LEFT JOIN TBL_ALT_EXT_SITE_INFO esi on esi.ALT_EXT_SITE_ID = asi.ALT_EXT_SITE_ID and esi.CUST_ID = ts.CUST_ID
            WHERE
                ts.sub_id = v_sub_id;
            
            -- CREATE LOCATION
            create_location(adrx_info);
        
procedure create_location(
        adrx_info                                                                   in TABLE (??)
    ) as
    
    BEGIN
        
        run statements using adrx_info.ADRX1, adrx_info.STATE, etc...
        
    END;

person D W    schedule 13.04.2021    source источник


Ответы (1)


Если я вас правильно понял, то: вместо того, чтобы создавать типы внутри процедуры PL/SQL (чтобы они были видны только в ней), создайте их на уровне SQL (используя оператор CREATE TYPE). Затем вы можете использовать его где угодно, во всех ваших процедурах PL/SQL, без необходимости заново вводить все заново.

Или, если это пакет, создайте тип в спецификации пакета, и он будет использоваться во всех процедурах внутри этого пакета.

person Littlefoot    schedule 13.04.2021
comment
То есть это было бы в пакете, но вне блоков процедуры? - person D W; 13.04.2021
comment
Пакет спецификация был моим предложением. - person Littlefoot; 13.04.2021
comment
Не буду ли я тогда передавать заполненную переменную следующей процедуре, с которой я хочу ее использовать? Или будет так, что я передам его, но тип станет в adrx_info_tbl вместо TABLE, где он у меня есть для процедуры create_location? - person D W; 13.04.2021
comment
Вы всегда передаете переменную и тип, как и любой другой параметр. Будет ли заполнено (должно быть) заполнено или нет, зависит от логических потребностей процедуры (процедур). Так что, возможно, populate_adrx_info( p_adrx_info out adrx_info_tbl) и он пуст; затем Consumer_adrx_info(p_adrx_info в adrx_info_tbl) и он заполняется. Но в любом случае вы передаете переменную, определенную как adrx_info_tbl. - person Belayer; 14.04.2021