如何从Python中的存储过程获取输出参数?

2024-04-29 05:18:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我在网上搜索了一下,但也许我没有在搜索框中输入正确的魔法咒语。

有人知道如何从Python中的存储过程获取输出参数吗?我正在使用pymssql调用一个存储过程,我不确定返回输出参数的语法是否正确。我不认为我可以使用任何其他的数据库模块,因为我运行这个从一个Linux盒连接到一个MS服务器上的mssql数据库。

import pymssql

con = pymssql.connect(host='xxxxx',user='xxxx',password='xxxxx',database='xxxxx')

cur = con.cursor()

query = "EXECUTE blah blah blah"

cur.execute(query)
con.commit()
con.close()

Tags: 模块数据库参数过程linux魔法语法query
3条回答

我不是python专家,但在简要阅读了DB-API 2.0之后,我相信您应该像这样使用游标的“callproc”方法:

cur.callproc('my_stored_proc', (first_param, second_param, an_out_param))

然后在“an_out_param”变量的返回值(out param)中得到结果。

如果您不能或不想修改原始过程并有权访问数据库,那么可以编写一个简单的包装过程,该过程可以从python中调用。

例如,如果您有如下存储过程:

CREATE PROC GetNextNumber
   @NextNumber int OUTPUT
AS
...

您可以编写这样一个包装器,它很容易从python调用:

CREATE PROC GetNextNumberWrap
AS
    DECLARE @RNextNumber int
    EXEC GetNextNumber @RNextNumber
    SELECT @RNextNumber
GO

然后您可以从python调用它,如下所示:

import pymssql
con = pymssql.connect(...)
cur = con.cursor()
cur.execute("EXEC GetNextNumberWrap")
next_num = cur.fetchone()[0]

如果使过程生成一个表,则可以使用该结果替代out params。

所以不是:

CREATE PROCEDURE Foo (@Bar INT OUT, @Baz INT OUT) AS
BEGIN
   /* Stuff happens here */
   RETURN 0
END

CREATE PROCEDURE Foo (@Bar INT, @Baz INT) AS
BEGIN
   /* Stuff happens here */
   SELECT @Bar Bar, @Baz Baz
   RETURN 0
END

相关问题 更多 >