Jython ziclix JDBC,获取存储过程返回值 - 链式事务模式

时间:2013-07-03 06:27:10

标签: stored-procedures jdbc jython sybase

我试图获取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存储过程中获取返回值?

1 个答案:

答案 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))