【问题标题】:Using a BULK COLLECT variable in a procedure and referencing it's columns without declaring it all again在过程中使用 BULK COLLECT 变量并引用它的列而不再次声明它
【发布时间】:2021-07-08 01:47:42
【问题描述】:

我正在使用批量收集从大量地址字段中收集值(缩短以使代码更小),并且我想将该变量传递到包中的不同过程中,然后引用这些列。程序的类型是什么?我已经很好地设置了批量收集部分,它只是在消耗它(过程 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;

【问题讨论】:

    标签: plsql types package procedure bulk-collect


    【解决方案1】:

    如果我理解正确,那么:不要在 PL/SQL 过程中创建类型(以便它们仅在其中“可见”),而是在 SQL 级别(使用 @ 987654321@ 声明)。然后,您可以在所有 PL/SQL 过程中的任何地方使用它,而无需再次重新键入所有内容。

    或者,如果它是一个包,则在包规范中创建类型,然后它将用于该包中的所有过程。

    【讨论】:

    • 所以它会在包中,但在程序块之外?
    • 包装规格是我的建议。
    • 然后我不会将填充的变量传递给我想使用它的下一个过程吗?或者是我通过了它,但是类型变成了“in adrx_info_tbl”而不是“in TABLE”,我在 create_location 过程中有它?
    • 你总是传递一个变量和类型,就像你传递任何其他参数一样。 if 是否(应该)填充取决于过程的逻辑需求。所以也许“populate_adrx_info(p_adrx_info out adrx_info_tbl)”它是空的;然后“consume_adrx_info(p_adrx_info in adrx_info_tbl)”并被填充。但无论哪种方式,您都在传递一个定义为 adrx_info_tbl 的变量。
    猜你喜欢
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 2019-10-27
    • 2020-01-24
    • 2019-08-03
    • 1970-01-01
    相关资源
    最近更新 更多