11

少しググってみましたが、検索ボックスに正しい魔法の呪文を入れていなかったのかもしれません。

Python でストアド プロシージャから出力パラメータを取得する方法を知っている人はいますか? pymssql を使用してストアド プロシージャを呼び出していますが、出力パラメーターを取得するための正しい構文がわかりません。Linuxボックスからこれを実行してMSサーバー上のmssqlデータベースに接続しているため、他のdbモジュールを使用できるとは思いません。

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

10 に答える 10

4

私は python の専門家ではありませんが、DB-API 2.0を簡単に熟読した後、カーソルの「callproc」メソッドを次のように使用する必要があると思います。

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

次に、「an_out_param」変数の (out パラメータの) 戻り値に結果が含まれます。

于 2008-10-10T15:59:36.020 に答える
3

元のプロシージャを変更できない、または変更したくない場合、およびデータベースにアクセスできる場合は、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]
于 2008-10-20T22:22:29.393 に答える
1

freetds (pymssql、pyodbc など) の上に実装されたすべての python dbapi ライブラリは、Microsoft SQL Server 7 SP3 以降に接続するときに出力パラメーターにアクセスできないようです。

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

于 2008-10-20T21:32:53.347 に答える
1

プロシージャでテーブルを生成する場合は、その結果を out パラメータの代わりに使用できます。

したがって、代わりに:

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
于 2008-10-13T17:34:14.470 に答える
1

Python を使用して、SQL ストアド プロシージャから出力値を取得できました。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
于 2009-10-20T17:58:40.350 に答える
1

2016 更新 (pymssql 2.x での callproc サポート)

pymssql v2.x は、callproc. pymssql.output()パラメーター構文を使用して OUTPUT パラメーターをサポートします。ただし、callprocストアド プロシージャが結果セットも返さない場合にのみ、OUTPUT パラメータを取得できることに注意してください。この問題については、こちらの 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]この場合)。

結果セットを返すストアド プロシージャの場合

ストアド プロシージャが 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,)]
于 2016-10-10T23:42:58.560 に答える
0

これが私が行った方法です。重要なのは、最初に出力パラメーターを宣言することです。

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())
于 2016-11-30T02:17:48.790 に答える
0

また、EXECUTE ではなく SELECT の使用を検討することもできます。EXECUTE は(iirc)基本的に、実際には何もフェッチしない SELECT です(副作用を発生させるだけです)。

于 2008-10-13T17:26:58.650 に答える