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
odbc
ActiveStatePython2.7のモジュールとモジュールを試しpyodbc
ました。
私の質問:
ODBCドライバーを介してOracleデータベース関数(プロシージャではない)を呼び出す方法はありますか?そして、その結果を取得する方法は?