2013-07-03 13 views
0

我试图获取由Sybase用户定义的存储过程返回的值,以下是代码片段。Jython ziclix JDBC,获取存储过程返回值 - 链接事务模式

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: Stored procedure 'usp_find' may be run only in unchained transaction mode. The 'SET CHAINED OFF' command will cause the current session to use unchained transaction mode. [SQLCode: 7713], [SQLState: ZZZZZ]

但是,如果我在callStoredProc()添加conn.execute("SET CHAINED OFF")它返回None

有没有办法在Jython/Python中从sybase存储过程中获取返回值?

回答

1

我不知道如何更改chainde转换模式,但我希望您尝试“清除”JDBC和CallableStatemet。这样的代码看起来像(我没有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)) 
+0

感谢您的提示,它的工作。我只想为像我这样的新手添加更多的线条; 从java.sql中导入的DriverManager 进口java.sql.Types中作为类型 分贝=的DriverManager.getConnection( “JDBC:SYBASE:TDS:192.168.1.100:3397 /的StagingDB”, “SA”, “”) 然后几乎所有的线路。 正确的语法将取决于如何编写用户定义的存储过程,在这方面我必须模拟一些实际问题,sp_helptext也有帮助。 – r0ash