cx_oracle: может ли callfunc вернуть список? - PullRequest
0 голосов
/ 08 ноября 2011

Я пытаюсь написать функцию PL / SQL, которая возвращает массив целых чисел, а затем может вызвать его с помощью функции вызова cx_Oracles. Я думаю, что правильно понял функцию PL / SQL, но я не знаю, как вызвать ее с помощью cx_Oracle.

create or replace type test_type is table of NUMBER(10);

create or replace function test_function (n in INTEGER)
RETURN test_type
AS
  tmp_tab test_type := test_type();
BEGIN
  tmp_tab.EXTEND(n);
  FOR i IN 1 .. n LOOP
    tmp_tab(i) := i;
  END LOOP;
  RETURN tmp_tab;
END;

Работает с sqlplus:

SQL> select test_function(20) from dual;

TEST_FUNCTION(20)
--------------------------------------------------------------------------------
TEST_TYPE(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)

Как я могу получить результат такой функции, используя cx_Oracle? Это возможно?

Я нашел это http://osdir.com/ml/python.db.cx-oracle/2005-06/msg00014.html, но я действительно не знаю, как его использовать. Когда я изменяю свое определение типа на:

create or replace type test_type is table of NUMBER(10) index by binary_integer;

Я получаю: Предупреждение: тип создан с ошибками компиляции.

SQL> sho err
Errors for TYPE TEST_TYPE:

LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0  PL/SQL: Compilation unit analysis terminated
1/19     PLS-00355: use of pl/sql table not allowed in this context

1 Ответ

1 голос
/ 08 ноября 2011

Что-то в строках,

import cx_Oracle

db_sid = 'db_sid'
db_usr = 'schema'
db_pwd = 'passwd'

conn_data = str('%s/%s@%s') % (db_usr, db_pwd, db_sid)

try:
    db = ora.connect(conn_data)
    except ora.DatabaseError, e:
    error, = e
    ORAmessage = error.message.rstrip("\n")
    print "DatabaseError: %s" % ORAmessage
else:
    cursor = db.cursor()
    try:
        out_parameter = cursor.var(cx_Oracle.NUMBER)
        # calling function to retrieve results until 20
        execute_func  = cursor.callfunc('test_function', out_parameter, [20])
        print str(return_value.getvalue())
    except ora.DatabaseError, exc:
        error, = exc
        ORAmessage = error.message.rstrip("\n")
        print "DatabaseError: %s" % ORAmessage
    cursor.close()

db.close()

Чтение этой части руководства также будет полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...