Как вы получаете выходные параметры из хранимой процедуры в Python?

Я немного погуглил, но, возможно, я не добавил правильное заклинание магии в окно поиска.

Кто-нибудь знает, как получить выходные параметры из хранимой процедуры в Python? Я использую pymssql для вызова хранимой процедуры, и я не уверен в правильном синтаксисе для возврата выходного параметра. Я не думаю, что могу использовать какие-либо другие модули db, так как я запускаю это из коробки Linux для подключения к базе данных mssql на MS Server.

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()

Ответы на вопрос(9)

вы можете использовать этот результат вместо наших параметров.

Так что вместо:

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

ользованием Python. Я не мог найти хорошую помощь, получая выходные значения в Python. Я сам понял синтаксис Python, поэтому я подозреваю, что это стоит опубликовать здесь:

import sys, string, os, shutil, arcgisscripting
from win32com.client import Dispatch
from adoconstants import *

#skip ahead to the important stuff

conn = Dispatch('ADODB.Connection')
conn.ConnectionString = "Provider=sqloledb.1; Data Source=NT38; Integrated Security = SSPI;database=UtilityTicket"
conn.Open()

#Target Procedure Example: EXEC TicketNumExists @ticketNum = 8386998, @exists output

Cmd = Dispatch('ADODB.Command')
Cmd.ActiveConnection = conn

Cmd.CommandType = adCmdStoredProc
Cmd.CommandText = "TicketNumExists"

Param1 = Cmd.CreateParameter('@ticketNum', adInteger, adParamInput)
Param1.Value = str(TicketNumber)
Param2 = Cmd.CreateParameter('@exists', adInteger, adParamOutput)

Cmd.Parameters.Append(Param1)
Cmd.Parameters.Append(Param2)

Cmd.Execute()

Answer = Cmd.Parameters('@exists').Value
Обновление 2016 года (поддержка callproc в pymssql 2.x)

callproc, Он поддерживает параметры OUTPUT, используяpymssql.output() Синтаксис параметров. Обратите внимание, однако, что параметры OUTPUT могут быть получены только сcallproc если хранимая процедура делаетне также вернуть набор результатов. Этот вопрос обсуждается на GitHubВот.

Для хранимых процедур, которые не возвращают набор результатов

Учитывая хранимую процедуру T-SQL

CREATE PROCEDURE [dbo].[myDoubler] 
    @in int = 0, 
    @out int OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    SELECT @out = @in * 2;
END

код Python

import pymssql
conn = pymssql.connect(
    host=r'localhost:49242',
    database='myDb',
    autocommit=True
    )
crsr = conn.cursor()

sql = "dbo.myDoubler"
params = (3, pymssql.output(int, 0))
foo = crsr.callproc(sql, params)
print(foo)
conn.close()

производит следующий вывод

(3, 6)

Заметить, чтоcallproc возвращает кортеж параметра со значением параметра OUTPUT, назначенным хранимой процедурой (foo[1] в этом случае).

Для хранимых процедур, которые возвращают набор результатов

Если хранимая процедура возвращает один или несколько наборов результатова также также возвращает выходные параметры, нам нужно использовать блок анонимного кода для получения значений выходного параметра:

Хранимая процедура:

ALTER PROCEDURE [dbo].[myDoubler] 
    @in int = 0, 
    @out int OUTPUT
AS
BEGIN
    SET NOCOUNT ON;
    SELECT @out = @in * 2;
    -- now let's return a result set, too
    SELECT 'foo' AS thing UNION ALL SELECT 'bar' AS thing;
END

Код Python:

sql = """\
DECLARE @out_value INT;
EXEC dbo.myDoubler @in = %s, @out = @out_value OUTPUT;
SELECT @out_value AS out_value;
"""
params = (3,)
crsr.execute(sql, params)
rows = crsr.fetchall()
while rows:
    print(rows)
    if crsr.nextset():
        rows = crsr.fetchall()
    else:
        rows = None

Результат:

[('foo',), ('bar',)]
[(6,)]

Вы можете попытаться переформатироватьquery:

import pypyodc

connstring = "DRIVER=SQL Server;"\
             "SERVER=servername;"\
             "PORT=1043;"\
             "DATABASE=dbname;"\
             "UID=user;"\
             "PWD=pwd"

conn = pypyodbc.connect(connString)
cursor = conn.cursor()

query="DECLARE @ivar INT \r\n" \
      "DECLARE @svar VARCHAR(MAX) \r\n" \
      "EXEC [procedure]" \
      "@par1=?," \
      "@par2=?," \
      "@[email protected] OUTPUT," \
      "@[email protected] OUTPUT \r\n" \
      "SELECT @ivar, @svar \r\n"
par1=0
par2=0
params=[par1, par2]
result = cursor.execute(query, params)
print result.fetchall()

[1]https://amybughunter.wordpress.com/tag/pypyodbc/

import cx_Oracle as Oracle

conn = Oracle.connect('xxxxxxxx')
cur = conn.cursor()

idd = cur.var(Oracle.NUMBER)
cur.execute('begin :idd := seq_inv_turnover_id.nextval; end;', (idd,))
print(idd.getvalue())

ступ к базе данных, вы можете написать простую процедуру-обертку, которая вызывается из 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]
 Constantin24 февр. 2009 г., 17:08
Интересно, можно ли сделать это без вспомогательного sproc, просто с помощью conn.execute ("DECLARE @RNextNumber int; EXEC GetNextNumber @RNextNumber out; SELECT @RNextNumber").

а не EXECUTE. EXECUTE - это (iirc) в основном SELECT, который на самом деле ничего не извлекает (просто вызывает побочные эффекты).

что каждая библиотека Python dbapi, реализованная поверх freetds (pymssql, pyodbc и т. Д.), Не сможет получить доступ к выходным параметрам при подключении к Microsoft SQL Server 7 SP3 и выше.

http://www.freetds.org/faq.html#ms.output.parameters

 Gord Thompson11 окт. 2016 г., 01:49
Этот ответ устарел, по крайней мере, для pymssql.

Я не эксперт по питону, но после краткого изученияDB-API 2.0 Я считаю, что вы должны использовать метод "callproc" курсора следующим образом:

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

Затем вы получите результат в возвращаемом значении (выходного параметра) в переменной "an_out_param".

 jloria24 дек. 2014 г., 03:00
На всякий случай, если кто-то еще увидит этот ответ, вы должны передать в callproc выходные параметры, заключенные в следующую строку: pymssql.output (int, -1) Как описано здесь:github.com/pymssql/pymssql/blob/...
 projecktzero10 окт. 2008 г., 21:21
Похоже, что он охватывает почти то же, что и эта ссылка:ramblings.timgolden.me.uk/2007/09/26/... Похоже, что ни один из free / oss не поддерживает callproc или не работает на Linux. Мне может понадобиться поиск решения для веб-сервисов.
 Milen A. Radev10 окт. 2008 г., 20:52
Попробуйте найти другой драйвер, более совместимый с DB-API 2.0. Начало здесь -wiki.python.org/moin/SQL_Server
 Tomalak13 окт. 2008 г., 19:52
Я думаю, что прочитал, что callproc в настоящее время не реализован для SQL Server, когда я немного погуглил по этому вопросу.
 projecktzero10 окт. 2008 г., 20:21
Аааа ... к сожалению, я получаю эту ошибку. Похоже, у pymssql нет callproc. AttributeError: экземпляр pymssqlCursor не имеет атрибута 'callproc'

Ваш ответ на вопрос