【问题标题】:Jython ziclix JDBC, get stored procedure return value - Chained Transaction ModeJython ziclix JDBC,获取存储过程返回值——链式事务模式
【发布时间】:2013-06-30 17:40:03
【问题描述】:

我正在尝试获取 Sybase 用户定义的存储过程返回的值,以下是代码 sn-p。

从 com.ziclix.python.sql 导入 zxJDBC

def callStoredProc(conn, procName, *args):
    conn.execute("使用数据库")
    sql = """声明@ret int
             执行@ret = %s %s
             SELECT @ret""" % (procName, ','.join(['?'] * len(args)))
    返回 int(conn.execute(sql, args).fetchone()[0])

jdbc_url = "jdbc:sybase:Tds:192.168.1.100:3397/stagingdb"
用户名 = "sa"
密码 = ""
驱动程序=“com.sybase.jdbc4.jdbc.SybDriver”
conn = zxJDBC.connect(jdbc_url, 用户名, 密码, 驱动)
光标 = conn.cursor()

打印 callStoredProc(光标,“usp_find”,“苹果”)

但是当我运行脚本时,它会说;

zxJDBC.Error: 存储过程“usp_find”只能在非链式事务模式下运行。 'SET CHAINED OFF' 命令将导致当前会话使用非链式事务模式。 [SQLCode: 7713], [SQLState: ZZZZZ]

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

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

【问题讨论】:

    标签: stored-procedures jdbc jython sybase


    【解决方案1】:

    我不知道如何更改链式传输模式,但我希望您尝试“清除” 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))
    

    【讨论】:

    • 感谢您的提示,它成功了。我只想为像我这样的新手添加几行; from java.sql import DriverManager import java.sql.Types as types db = DriverManager.getConnection("jdbc:sybase:Tds:192.168.1.100:3397/stagingdb", "sa", "") 然后几乎所有的行。正确的语法将取决于用户定义的存储过程的编写方式,在这方面我必须稍微塑造我的实际问题,sp_helptext 也很有帮助。
    猜你喜欢
    • 2013-07-24
    • 1970-01-01
    • 2013-01-22
    • 2019-01-04
    • 1970-01-01
    • 2020-02-15
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多