2013-07-03 42 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