Как получить результат функции базы данных Oracle через ODBC?

У меня проблема с вызовом хранимой функции Oracle (не процедуры) через ODBC.

Моя функция действительно проста, она объединяет две строки. Я могу позвонить через:

rs = c.execute("SELECT add_str('yogi', 'bubu') FROM dual")
for row in c.fetchall():
    print(row[0])

Но такой тип вызывающей функции базы данных не будет работать для функций, которые изменяют базу данных. Итак, я попробовал это:

c.execute("{ ? = call add_str('ala', 'bubu') }");

Но я получил:

Error: HY000: The driver did not supply an error!

В файле трассировки ODBC это выглядит так:

python.exe odbc a20-e68 ENTER SQLExecDirect 
        HSTMT               00A02CE0
        UCHAR *             0x00AA6CE4 [      -3] "{ ? = call add_str('ala', 'bubu') }\ 0"
        SDWORD                    -3

python.exe odbc a20-e68 EXIT  SQLExecDirect  with return code -1 (SQL_ERROR)
        HSTMT               00A02CE0
        UCHAR *             0x00AA6CE4 [      -3] "{ ? = call add_str('ala', 'bubu') }\ 0"
        SDWORD                    -3

python.exe odbc a20-e68 ENTER SQLGetDiagRecW 
        SQLSMALLINT                  3 
        SQLHANDLE           00A02CE0
        SQLSMALLINT                  1 
        SQLWCHAR *          0x0021F7BC (NYI) 
        SQLINTEGER *        0x0021F808
        SQLWCHAR *          0x00A035F8 (NYI) 
        SQLSMALLINT               1023 
        SQLSMALLINT *       0x0021F818

python.exe odbc a20-e68 EXIT  SQLGetDiagRecW  with return code 100 (SQL_NO_DATA_FOUND)
        SQLSMALLINT                  3 
        SQLHANDLE           00A02CE0
        SQLSMALLINT                  1 
        SQLWCHAR *          0x0021F7BC (NYI) 
        SQLINTEGER *        0x0021F808
        SQLWCHAR *          0x00A035F8 (NYI) 
        SQLSMALLINT               1023 
        SQLSMALLINT *       0x0021F818

Подобная операция возможна с JDBC/Jython:

proc = db.prepareCall("{ ? = call add_str('j_bubu', 'j_yogi') }");
proc.registerOutParameter(1, Types.VARCHAR)
r = proc.execute();
print(proc.getString(1))

так что должно быть возможно сделать подобное с помощью ODBC и Python. Я проверил, что если я использовал мост JDBC-ODBC, то Jython может вызывать функцию базы данных через ODBC, как и собственный драйвер JDBC.

Моя среда:

База данных: Oracle Database 11g Enterprise Edition, выпуск 11.2.0.1.0 - 64-разрядная версия

Драйвер ODBC: 11.01.00.06

SQORA32.DLL FileVersion: 11.1.0.6.0

Я старался odbc модуль из ActiveState Python 2.7 и pyodbc модуль.

Мой вопрос:

Есть ли способ вызова функции базы данных Oracle (не процедуры) через драйвер ODBC? И как получить его результат?

1 ответ

Google поднял эту страницу:

http://www.gossamer-threads.com/lists/python/python/71449

... Я не думаю, что ODBC поддерживает хранимые процедуры, возвращающие значение напрямую. Только как часть курсора....

По сути, вы не можете вызвать функцию напрямую. Вы можете, однако, создать процедуру с OUT параметр вместо.

Другие вопросы по тегам