【问题标题】:Using SQLAlchemy to pass a list of values to an Oracle function使用 SQLAlchemy 将值列表传递给 Oracle 函数
【发布时间】:2016-06-24 00:15:01
【问题描述】:

这是我的自定义类型:

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()

我总是收到这条消息:

[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']}]

【问题讨论】:

    标签: python oracle sqlalchemy cx-oracle


    【解决方案1】:

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

    type mytype is table of varchar2(10) index by binary_integer;
    

    直到最近才支持绑定 SQL 类型,例如您创建的那种。这将在 5.3 发布时提供,但如果您愿意,您现在可以自己构建它。在这种情况下,您需要这样的代码:

    typeObj = connection.gettype("MYTYPE")
    value = typeObj(["1", "2", "3"])
    

    这个值你应该可以毫无困难地传递给 func.test_array。

    【讨论】:

    • 我没有找到gettype方法。我尝试在 cx_Oracle 5.2.1 的源代码中搜索,但没有成功。
    • 在 5.2.1 中不可用。这是源存储库中的新代码,但尚未发布。来源可以在这里找到:bitbucket.org/anthony_tuininga/cx_oracle/src
    • 谢谢。我会等待 cx_oracle 的 5.3 版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多