0

ODBCを介したOracleストアド関数(プロシージャではない)の呼び出しに問題があります。

私の関数は本当に単純で、2つの文字列を連結するだけです。私はそれを介して呼び出すことができます:

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はネイティブJDBCドライバーと同じようにODBC経由でデータベース関数を呼び出すことができることを確認しました。

私の環境:

データベース:Oracle Database 11gEnterpriseEditionリリース11.2.0.1.0-64ビット本番環境

ODBCドライバー:11.01.00.06

SQORA32.DLLファイルバージョン:11.1.0.6.0

odbcActiveStatePython2.7のモジュールとモジュールを試しpyodbcました。

私の質問:

ODBCドライバーを介してOracleデータベース関数(プロシージャではない)を呼び出す方法はありますか?そして、その結果を取得する方法は?

4

1 に答える 1

0

Google は次のページを表示しました。

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

... ODBC は値を直接返すストアド プロシージャをサポートしていないと思います。カーソルの一部としてのみ。...

基本的に、関数を直接呼び出すことはできません。OUTただし、代わりにパラメーターを使用してプロシージャーを作成することもできます。

于 2012-07-18T13:56:34.540 に答える