如何将python数组传递给oracle存储过程? [英] How to pass a python array to an oracle stored procedure?

查看:170
本文介绍了如何将python数组传递给oracle存储过程?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有问题。当我传递一个Python数组时:

  self.notPermited = [2,3] 

这是我的过程

  def select_ids_entre_amistades( self,cod_us,ids_not):
lista = []
尝试:
游标= self .__ cursor.var(cx_Oracle.CURSOR)
print ids_not
data = self .__ cursor.arrayvar(cx_Oracle.NUMBER,ids_not)
打印数据
l_query = self .__ cursor.callproc( SCHEMA.PROC_SELECT_IDS_ENT_AMISTADES,[cursor,cod_us,data])
lista = l_query [0]
返回lista
,除了cx_Oracle.DatabaseError如:
error,= ex.args
print(error.message)
return lista

问题是当我使用以下方法调用该过程时:

  self.select_ids_entre_amistades(int_id,self.notPermited)

I在控制台中可视化以下消息:


PLS-00306:调用'PROC


In时参数的数量或类型错误在数据库中,我创建了这样的数组对象:

 创建类型SCHEMA.ARRAY_ID_FRIENDS作为整数表; 

Oracle存储过程如下所示:

 创建或替换程序脸书.PROC_SELECT_IDS_ENT_AMISTADES 
(CONSULTA OUT SYS_REFCURSOR,COD_US IN INT,IDS_FRIEND IN SCHEMA.ARRAY_ID_FRIENDS)


我不知道问题是什么,我相信 cx_Oracle.NUMBER 不是整数,但是有其他数字类型。

解决方案

尝试在过程的参数中使用plsql数组,然后传递a的内容。 sql数组。最后一个将用于sql语句的程序。使用oracle数据库11g解决了我的麻烦,因为在12g中,您无需将内容传递到sql数组。可能是这样的代码:

  def select_ids_entre_amistades(self,cod_us,ids_not):
lista = []
试试:
游标= self .__ cursor.var(cx_Oracle.CURSOR)
varray = self .__ cursor.arrayvar(cx_Oracle.NUMBER,ids_not)
l_query = self .__ cursor.callproc( PACKFACE.P_SELECT_IDBFRIENDS,[光标,cod_us,varray])
lista = l_query [0]
返回lista
,但cx_Oracle.DatabaseError除外,例如:
错误,= ex。 args
self.guardar_errores('dato'+ str(error.message))
返回列表a

和这样的存储过程:
首先创建一个类型

 创建或替换类型LIST_IDS如表

第二步,创建您的包裹

 创建或替换软件包的内容为
,类型LISTADO_IDS为PLS_INTEGER的INT索引表;
过程P_SELECT_IDBFRIENDS(CONSULTA OUT SYS_REFCURSOR,COD_US IN INT,IDS_NOT IN LISTADO_IDS);
END;

最后创建包的主体

 创建或替换包装的身体包装是
程序P_SELECT_IDBFRIENDS(CONSULTA OUT SYS_REFCURSOR,COD_US IN INT,IDS_NOT LISTLIST_IDS)
IS
num_array LIST_
开始
num_array:= LIST_IDS();
for i in 1 .. IDS_NOT.count
loop
num_array.extend(1);
num_array(i):= IDS_NOT(i);
结束循环;

的公开咨询选择*从T_TABLE中输入ID(从TABLE(num_array)中选择COLUMN_VALUE);
END;
END;

我希望对您有所帮助。


I have a problem. When I pass a Python array:

self.notPermited = [2,3]

This is my procedure

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

The problem is when I call that procedure using this:

self.select_ids_entre_amistades(int_id,self.notPermited)

I visualize in the console the following message:

PLS-00306: wrong number or types of arguments in call to 'PROC

In the database I create the array object like this:

CREATE TYPE SCHEMA.ARRAY_ID_FRIENDS AS TABLE OF INT;

The Oracle stored procedure starts like this:

CREATE OR REPLACE PROCEDURE FACEBOOK.PROC_SELECT_IDS_ENT_AMISTADES
(CONSULTA OUT SYS_REFCURSOR,COD_US IN INT, IDS_FRIEND IN SCHEMA.ARRAY_ID_FRIENDS)

I don't know what the problem is, I believe cx_Oracle.NUMBER is not integer but there aren't other numeric type. Thanks in advance.

解决方案

Try to use a plsql array in the parameters of the procedure and after that you pass the content of a sql array. The last one will be used to the sql statement into the procedure. It solve my trouble using oracle database 11g because in 12g you don't need to pass the content to an sql array. This could be the code:

def select_ids_entre_amistades(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("PACKFACE.P_SELECT_IDBFRIENDS", [cursor, cod_us, varray])
        lista = l_query[0]
        return lista
    except cx_Oracle.DatabaseError as ex:
        error, = ex.args
        self.guardar_errores('dato ' + str(error.message))
        return lista

And the stored procedure like this: First you create a type

CREATE OR REPLACE TYPE LIST_IDS AS TABLE OF INT;

Second you create your package

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;

And finally create the body of the package

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 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 * FROM T_TABLE WHERE ID IN (SELECT COLUMN_VALUE FROM TABLE(num_array));
    END;
END;

I hope that It helps you.

这篇关于如何将python数组传递给oracle存储过程?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆