我试图获取Sybase用户定义的存储过程返回的值,以下是代码片段。
from com.ziclix.python.sql import zxJDBC def callStoredProc(conn, procName, *args): conn.execute("USE DB") sql = """DECLARE @ret int EXEC @ret = %s %s SELECT @ret""" % (procName, ','.join(['?'] * len(args))) return int(conn.execute(sql, args).fetchone()[0]) jdbc_url = "jdbc:sybase:Tds:192.168.1.100:3397/stagingdb" username = "sa" password = "" driver = "com.sybase.jdbc4.jdbc.SybDriver" conn = zxJDBC.connect(jdbc_url, username, password, driver) cursor = conn.cursor() print callStoredProc(cursor, "usp_find", "Apples" )
但是当我运行脚本时,它说;
zxJDBC.Error:存储过程'usp_find'只能在非链式事务模式下运行。 'SET CHAINED OFF'命令将使当前会话使用非链式事务模式。 [SQLCode:7713],[SQLState:ZZZZZ]
但是,如果我在conn.execute("SET CHAINED OFF")
中添加callStoredProc()
,则会返回None
。
有没有办法在Jython / Python中从sybase存储过程中获取返回值?
答案 0 :(得分:1)
我不知道如何更改链式事务模式,但我希望您尝试“清除”JDBC和CallableStatement。这样的代码看起来像(我没有Sybase所以我无法测试它):
db = DriverManager.getConnection(db_url, usr, passwd)
proc = db.prepareCall("{ ? = call usp_find(?) }");
proc.registerOutParameter(1, Types.INTEGER)
proc.setString(2, "Apples");
proc.execute();
r = proc.getInt(1)
print('result: %d' % (r))