使用 SQLAlchemy 将值列表传递给 Oracle 函数
Using SQLAlchemy to pass a list of values to an Oracle function
这是我的自定义类型:
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']}]
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。
这是我的自定义类型:
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']}]
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。