Выполнение хранимой процедуры из Python

1

Я работаю с 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  

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

Спасибо

Теги:
database
stored-procedures
odbc

1 ответ

1

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

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

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

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

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

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

Сообщите мне, если это работает.

  • 1
    Спасибо, я также прочитал это в документации и попробовал вчера, но я не уверен, что использую правильные параметры, так как они не детализируются на странице документации. Я продолжаю получать ошибки синтаксиса базы данных, когда я пытаюсь использовать метод execdirect. Я посмотрел на синтаксис операторов execdirect и экспериментировал, чтобы понять, получаю ли я правильную комбинацию.
  • 0
    Неважно, что я делаю, я не могу заставить это работать! Это всегда уходит рано на меня.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню