Plsql 在'上迭代;表';生成ref游标的步骤
我有许多旧SP,它们的输出参数类型为“table of”,如下所示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
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_光标,可能会更好。