如何使用数组参数创建oracle存储过程

时间:2016-02-15 21:04:27

标签: oracle python-2.7 stored-procedures oracle11g cx-oracle

我将Oracle存储过程编入包中。我确实喜欢这个:

CREATE OR REPLACE PACKAGE BODY PACKFACE IS
    PROCEDURE P_SELECT_IDBFRIENDS (CONSULTA OUT SYS_REFCURSOR,COD_US IN INT, IDS_NOT IN LIST_IDS) IS
    BEGIN
        OPEN CONSULTA FOR 
        SELECT ID_US1,ID_US2 FROM T_FRIENDSHIP WHERE ID_US1=COD_US AND ID_US2 NOT IN (SELECT COLUMN_VALUE FROM TABLE(IDS_NOT));
    END;
END;
/

包裹的主体是:

def select_ids(self,cod_us,ids_not):
    lista = []
    try:
        cursor = self.__cursor.var(cx_Oracle.CURSOR)
        varray = self.__cursor.arrayvar(cx_Oracle.NUMBER,ids_not)
        l_query = self.__cursor.callproc("PROC_SELECT_IDS_ENT_AMISTADES", [cursor, cod_us, varray])
        lista = l_query[0]
        return lista
    except cx_Oracle.DatabaseError as ex:
        error, = ex.args
        print(error.message)
        return lista

这些在我的Oracle 12c服务器上没问题,但我在Oracle 11g中做了相同的代码出现了错误,无法访问非嵌套表中的行ítem。什么是解决方案?提前致谢 解决了这个问题后。出现另一个我的Python代码被破坏了。我有这个程序:

$iDontWant

PLS-00306在调用过程时错误的数字或类型的参数。可以使用Oracle 12c。再次感谢。

2 个答案:

答案 0 :(得分:1)

您无法在Oracle 11的SQL查询中使用PL / SQL中定义的集合类型。

如果要在SQL和PL / SQL中使用集合,则必须在SQL中定义它:

Subscription

然后你可以这样做:

CREATE TYPE LIST_IDS IS TABLE OF INT;

答案 1 :(得分:0)

首先,你应该像这样创建一个oracle类型:

CREATE OR REPLACE TYPE LIST_IDS AS TABLE OF INT;

之后,您应该使用过程和参数中的嵌套表创建包,如下所示:

CREATE OR REPLACE PACKAGE PACKFACE IS
TYPE LISTADO_IDS IS TABLE OF INT INDEX BY PLS_INTEGER;
PROCEDURE P_SELECT_IDBFRIENDS (CONSULTA OUT SYS_REFCURSOR,COD_US IN INT,IDS_NOT IN LISTADO_IDS);
END;

最后你应该创建一个身体。您将数据从oracle类型传递给嵌套表,如下所示:

CREATE OR REPLACE PACKAGE BODY PACKFACE IS
    PROCEDURE P_SELECT_IDBFRIENDS (CONSULTA OUT SYS_REFCURSOR,COD_US IN INT, IDS_NOT IN LISTADO_IDS) 
    IS
        num_array FACEBOOK.LIST_IDS;
    BEGIN
        num_array:=LIST_IDS();
        for i in 1 .. IDS_NOT.count
        loop
            num_array.extend(1);
            num_array(i) := IDS_NOT(i);
        end loop; 
        OPEN CONSULTA FOR 
        SELECT ID_US1,ID_US2 FROM T_FRIENDSHIP WHERE ID_US1=COD_US AND ID_US2 NOT IN (SELECT COLUMN_VALUE FROM TABLE(num_array));
    END;
END;

我这样做了,我得到了python错误的数字或类型参数的解决方案。祝你好运。