Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Python执行存储过程_Python_Sql_Database_Stored Procedures_Odbc - Fatal编程技术网

从Python执行存储过程

从Python执行存储过程,python,sql,database,stored-procedures,odbc,Python,Sql,Database,Stored Procedures,Odbc,我正在使用Python3,使用一个名为ceODBC的模块,并尝试在SQLServer2005中调用一个存储过程。当我在SQLServerManagementStudio外运行存储过程(不涉及Python)时,我得到了正确的结果,278行被插入到所需的表中,但是在Python中,它在31行之后停止。有人能告诉我为什么存储过程会过早停止吗?以下是我的Python代码: import ceODBC connect=ceODBC.connect("""DSN=mydatabase;SERVER=xxx.

我正在使用Python3,使用一个名为ceODBC的模块,并尝试在SQLServer2005中调用一个存储过程。当我在SQLServerManagementStudio外运行存储过程(不涉及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  
CREATETABLE语句和Python中的初始insert总是有效的。我的temp表中有278行,只有当我从Python调用存储过程时才会出错。存储过程提前终止。我认为这是因为Python可能没有给它足够的时间在程序结束前执行,所以我尝试放置某种计数器,但最终得到了数据库错误(尽管存储过程工作正常),所以我删除了计数器。我想要的是将控制权传递给存储过程,并且在存储过程完成之前不返回python程序。任何帮助都将不胜感激

谢谢看下面的评论:

Cursor.execdirect(语句)

使用SQLExecDirect而不是SQLExecute对数据库执行语句。这在某些情况下是必要的,因为ODBC驱动程序中存在错误,例如在调用某些存储过程时SQL Server ODBC驱动程序所显示的错误

如果语句是查询,则返回游标是为了方便,因为游标实现迭代器协议,因此无需调用适当的获取方法之一;否则将不返回任何值

听起来通过SQLServerODBC的存储过程有点疯狂(因为它们专门针对存储过程进行特殊处理)。您可能必须尝试:

cursor.execdirect("mydatabase.dbo.VisionExternalPMTS")
让我知道这是否有效。

查看下面的评论:

Cursor.execdirect(语句)

使用SQLExecDirect而不是SQLExecute对数据库执行语句。这在某些情况下是必要的,因为ODBC驱动程序中存在错误,例如在调用某些存储过程时SQL Server ODBC驱动程序所显示的错误

如果语句是查询,则返回游标是为了方便,因为游标实现迭代器协议,因此无需调用适当的获取方法之一;否则将不返回任何值

听起来通过SQLServerODBC的存储过程有点疯狂(因为它们专门针对存储过程进行特殊处理)。您可能必须尝试:

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

让我知道这是否有效。

谢谢,我也在文档中读到了这一点,并在昨天尝试了它,但我不确定我是否使用了正确的参数,因为它们在文档页面上没有详细介绍。当我尝试execdirect方法时,我不断得到数据库语法错误。我环顾了一下execdirect语句的语法,正在试验是否得到了正确的组合。无论我做什么,我似乎都无法让它工作!我总是很早就退出了。谢谢,我也在文档中读到了这一点,并在昨天尝试了它,但我不确定我使用的参数是否正确,因为它们没有在文档页面上详细介绍。当我尝试execdirect方法时,我不断得到数据库语法错误。我环顾了一下execdirect语句的语法,正在试验是否得到了正确的组合。无论我做什么,我似乎都无法让它工作!对我来说总是很早就结束了。