Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用SQLAlchemy将值列表传递给Oracle函数_Python_Oracle_Sqlalchemy_Cx Oracle - Fatal编程技术网

Python 使用SQLAlchemy将值列表传递给Oracle函数

Python 使用SQLAlchemy将值列表传递给Oracle函数,python,oracle,sqlalchemy,cx-oracle,Python,Oracle,Sqlalchemy,Cx Oracle,这是我的自定义类型: Create or replace TYPE mytype AS VARRAY(100) OF VARCHAR2(10); 这就是功能: create or replace function test_array (op_array mytype) RETURN VARCHAR2 IS str_query CLOB := 'test'; BEGIN for i in 1..op_array.count loop

这是我的自定义类型:

Create or replace TYPE mytype AS VARRAY(100) OF VARCHAR2(10);
这就是功能:

create or replace function test_array (op_array mytype)
    RETURN VARCHAR2 IS
        str_query CLOB := 'test';
    BEGIN
        for i in 1..op_array.count loop
           str_query := str_query || to_char( op_array(i) ) || ',';
        end loop;

        return str_query;
    END;
如果我使用SQLAlchemy调用如下函数:

Session.query(func.test_array(['1','2','3'])).all()
typeObj = connection.gettype("MYTYPE")
value = typeObj(["1", "2", "3"])
我总是收到这样的信息:

[sqlalchemy.engine.base.Engine] SELECT test_array(:test_array_2) AS test_array_1 FROM DUAL
[sqlalchemy.engine.base.Engine] {'test_array_2': ['1', '2', '3']}
*** DatabaseError: (cx_Oracle.DatabaseError) ORA-01484: arrays can only be bound to PL/SQL statements
 [SQL: 'SELECT test_array(:test_array_2) AS test_array_1 FROM DUAL'] [parameters: {'test_array_2': ['1', '2', '3']}]

cx_Oracle中的阵列绑定到PL/SQL类型,如下所示:

type mytype is table of varchar2(10) index by binary_integer;
直到最近才支持绑定SQL类型,例如您创建的SQL类型。这将在5.3版本中发布,但如果您愿意,现在可以自己构建。在这种情况下,您需要这样的代码:

Session.query(func.test_array(['1','2','3'])).all()
typeObj = connection.gettype("MYTYPE")
value = typeObj(["1", "2", "3"])

这个值应该可以毫无困难地传递给func.test\u数组。

我没有找到gettype方法。我尝试在cx_Oracle 5.2.1的源代码中搜索,但没有成功。它在5.2.1中不可用。这是源存储库中的新代码,但尚未发布。来源可以在这里找到:谢谢。我将等待cx_oracle的5.3版本。