Plsql 在'上迭代;表';生成ref游标的步骤

Plsql 在'上迭代;表';生成ref游标的步骤,plsql,oracle10g,associative-array,database-cursor,Plsql,Oracle10g,Associative Array,Database Cursor,我有许多旧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 BINA

我有许多旧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
);
TYPE t_cursor IS REF CURSOR ;
PROCEDURE Get_Associated_Unicorns(
    UNIID_IN IN ABC_UNICORNS.UNI_AUTOID%TYPE,
    v_cursor OUT t_cursor
);
。。。我想调整现有的处理,使sp的原型看起来像这样

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
);
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的人将使用一个ref游标,而不是三个“table of”对象

使用Oracle 10g PL/SQL如何调整现有SP,以便迭代“表”对象以填充作为唯一输出参数的ref游标


(三个'table of'参数的长度始终相同)。

如果首先在数据库中创建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;

如果首先在数据库中创建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;

这三个表类型变量是否在get_-associated_-unicorns过程中填充?如果是,它们是通过SQL select语句填充的吗?这三个表类型变量是在get_-associated_-unicorns过程中填充的吗?如果是这样,它们是通过SQL select语句填充的吗?我假设OP不想将这三个表传递给Proc,如果它们已经在Proc中填充,那么可以通过您建议的方法对它们进行迭代,而不必将它们包含在过程的签名中。(如果ided,则必须对其进行迭代,并且不能直接填充ref_游标)。@Ollie southof40可能没有考虑将3个表传递到单独的过程中,但为了最大限度地提高可重用性并减少耦合,我认为最好在一个单独的过程(如上面所述)中转换为ref游标。好的一点(+1),它将减少与原始过程的耦合。看看OP的整个问题(并做出一些……嗯……假设),如果他们不首先填充三个表(如果可能的话),直接填充ref_光标,可能会更好。我假设OP不想将三个表传递给Proc,如果已经在其中填充了它们,那么可以通过您建议的方法对它们进行迭代,而无需将它们包含在过程的签名中。(如果ided,则必须对其进行迭代,并且不能直接填充ref_游标)。@Ollie southof40可能没有考虑将3个表传递到单独的过程中,但为了最大限度地提高可重用性并减少耦合,我认为最好在一个单独的过程(如上面所述)中转换为ref游标。好的一点(+1),它将减少与原始过程的耦合。看看OP的整个问题(并做出一些……嗯……假设),如果他们不首先填充三个表(如果可能的话),而直接填充ref_光标,可能会更好。