Выполнение хранимой процедуры из Python - PullRequest
1 голос
/ 16 июня 2011

Я работаю с Python3, используя модуль ceODBC и пытаюсь вызвать хранимую процедуру в SQL Server 2005. Когда я запускаю хранимую процедуру из Sql Server Management Studio (без участия Python), я получаю правильные результаты и 278 строквставляются в нужную таблицу, однако в Python она останавливается после 31. Кто-нибудь может сказать мне, почему хранимая процедура может преждевременно останавливаться?Вот мой код Python:

import ceODBC
connect=ceODBC.connect("""DSN=mydatabase;SERVER=xxx.xxx.x.xxx;
DRIVER={SQLServer};UID=user;PWD=password""", autocommit= True)
cursor = connect.cursor()
cursor.execute(""" 
                   CREATE TABLE mydatabase.dbo.Vision_TempTable
                   (
                   CustId bigint,
                   PayProcId int,
                   WebUserId bigint,
                   SubTypeId bigint,
                   PayAmt decimal(18,2),
                   Paydate datetime,
                   PayType varchar(1),
                   DateCreated datetime,
                   PayStatus varchar(1),
                   Account varchar(30),
                   V_Account varchar(30)
                     )""")#Create a temp table which will be used in the SP insert  
connect.commit()
f=open('F:/clients/UTA/Vision/Data/ExternalPay_Data/lbox.txt')
CUST_ID=44
PAYPROCID=4
SUBTYPE_ID=64
WEBUSER_ID=2432
PAYTYPE='C'
PAYSTATUS='J'
for line in f: #parse a text file and insert values into temp table I just created
    lineLength=len(line.strip())
    if lineLength>=49:
        visionAccount=int(line[10:17])
        visionAccount=str(visionAccount)
        recipientID=line[17:29]
        invoiceAmount=line[31:39]
        invoiceAmount=float(invoiceAmount)
        pmtType=line[39:41]#make sure it will always be ck
        pmtDate=line[45:47]+'/'+line[47:49]+'/'+line[41:45]
        cursor.execute("""INSERT INTO mydatabase.dbo.Vision_TempTable
                            (CustId,PayProcId,WebUserId,SubTypeId,PayAmt,Paydate,
                            PayType,DateCreated,PayStatus,Account,V_Account)
                          VALUES
                              (?,?,?,?,?,?,?,GETDATE(),?,?,?)""",
               CUST_ID,PAYPROCID,WEBUSER_ID,SUBTYPE_ID,
               invoiceAmount,pmtDate,PAYTYPE,PAYSTATUS,recipientID,visionAccount)

        connect.commit()
cursor.callproc("mydatabase.dbo.VisionExternalPMTS")# turn over control to SP

f.close()
connect.close()
print('Done')  

, и, чтобы у нас была полная картина, я включу хранимую процедуру ниже:

   USE [mydatabase]
GO
/****** Object:  StoredProcedure [dbo].[VisionExternalPMTS]    Script Date: 06/16/2011 08:38:15 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[VisionExternalPMTS] as

BEGIN
declare @custid bigint,
@payprocid int,
@webuserid bigint,
@subtypeid bigint,
@payamt decimal(18,2),
@paydate datetime,
@paytype varchar(1),
@datecreated datetime,
@paystatus varchar(1),
@account varchar(30),
@v_account varchar(30)

DECLARE update_webPayments CURSOR for --select from temp table created in python
SELECT  CustId,PayProcId,WebUserId,SubTypeId,PayAmt,Paydate,PayType,
        DateCreated,PayStatus
FROM Vision_TempTable

OPEN update_webPayments

FETCH NEXT FROM update_webPayments INTO @custid,@payprocid,@webuserid,
                @subtypeid,@payamt,@paydate,@paytype,@datecreated,
                @paystatus

WHILE @@fetch_status = 0 --insert into target table
    BEGIN
        INSERT INTO WEBPAYMENTS(CUSTID,PAYPROCID,WEBUSERID,SUBTYPEID,
                                PAYAMT,PAYDATE,PAYTYPE,DATECREATED,PAYSTATUS)
        VALUES (@custid,@payprocid,@webuserid,@subtypeid,@payamt,
                @paydate,@paytype,@datecreated,@paystatus)
        FETCH NEXT FROM update_webPayments INTO @custid,@payprocid,@webuserid,
                    @subtypeid,@payamt,@paydate,@paytype,@datecreated,
                    @paystatus                          
    END 
--DROP TABLE VISION_TempTable
END  

Оператор создания таблицы и начальная вставка из Python всегдаработа Я получаю 278 строк в моей временной таблице, только когда я вызываю хранимую процедуру из python, что-то идет не так.Хранимая процедура завершается рано.Я думал, что это потому, что Python может не дать ему достаточно времени для выполнения до завершения программы, поэтому я попытался установить какой-то счетчик на месте, но в итоге получал ошибки базы данных (хотя хранимая процедура работала правильно), поэтому я удалилсчетчик.Я хочу передать управление хранимой процедуре и не возвращаться в программу python до тех пор, пока хранимая процедура не будет завершена.Любая помощь будет принята с благодарностью.

Спасибо

1 Ответ

1 голос
/ 16 июня 2011

Глядя на http://ceodbc.sourceforge.net/html/cursor.html есть этот комментарий:

Cursor.execdirect (оператор)

Выполните оператор для базы данных, используяSQLExecDirect вместо SQLExecute.Это необходимо в некоторых ситуациях из-за ошибок в драйверах ODBC, таких как ошибки драйвера ODBC для SQL Server при вызове определенных хранимых процедур.

Если оператор является запросом, курсор возвращаетсядля удобства, поскольку курсоры реализуют протокол итератора и, таким образом, нет необходимости вызывать один из подходящих методов выборки;в противном случае None не возвращается.

Звучит так, как будто существует сумасшествие с хранимыми процедурами через ODBC для SQL Server (учитывая, что они выделяют его для специальной обработки).Возможно, вам придется попробовать:

cursor.execdirect("mydatabase.dbo.VisionExternalPMTS")

Дайте мне знать, если это работает.

...