调用存储过程python 2.7 Django 1.6.6 SQL

2024-05-16 03:40:55 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我们的设置.py你知道吗

'default':  {
         'NAME': 'OUR_SERVER_NAME',
         'ENGINE': 'sqlserver_ado',
         'HOST': 'OUR_SERVER_IP',
         'USER': 'USER',
         'PASSWORD': 'OUR_SERVER_PASSWORD',
         'PORT': '1433',
         'OPTIONS' : {
            'provider': 'SQLOLEDB',
            'extra_params' : 'DataTypeCompatibility=80;MARS Connection=True'
        }
    }

我们使用的是Django 1.6.6和python 2.7,我们试图调用这个存储过程(它返回一个temp表):

CREATE PROCEDURE "prova_excel"()
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
SELECT @sys = CONVERT(varchar, SYSDATETIME(), 121)
 print @sys

 create table #temp(
     "CODICE_ARTICOLO" VARCHAR(50) NULL DEFAULT NULL,
     "MODELLO" VARCHAR(50) NULL DEFAULT NULL,
     "ARTICOLO" VARCHAR(50) NULL DEFAULT NULL,
     "DESCRIZIONE" VARCHAR(50) NULL DEFAULT NULL,
     "MATERIALE" VARCHAR(50) NULL DEFAULT NULL,
     "LINE" VARCHAR(50) NULL DEFAULT NULL,
     "COLORE" VARCHAR(50) NULL DEFAULT NULL,
     "COLORE_2" VARCHAR(50) NULL DEFAULT NULL,
     "LG" VARCHAR(50) NULL DEFAULT NULL,
     "SESSO" VARCHAR(50) NULL DEFAULT NULL,
     "LISTINO_ARTICOLO" FLOAT(53) NULL DEFAULT NULL,
     "PREZZO_RETAIL_ARTICOLO" FLOAT(53) NULL DEFAULT NULL,
     "MADE_IN" VARCHAR(50) NULL DEFAULT NULL,
     "NOTE" VARCHAR(50) NULL DEFAULT NULL,
     "BRAND_ID" INT NULL DEFAULT NULL,
     "STAGIONE_ID" INT NULL DEFAULT NULL,
     "COMPANY_ID" INT NULL DEFAULT NULL,
     "ID_EXCEL" INT NULL DEFAULT NULL,
     "ID_FILE" INT NULL DEFAULT NULL,
     "RIGA_ORDERS" VARCHAR(50) NULL DEFAULT NULL,
     "RAGIONE_SOCIALE_FORNITORE" VARCHAR(50) NULL DEFAULT NULL,
     "RAGIONE_SOCIALE_CLIENTE" VARCHAR(50) NULL DEFAULT NULL,
     "PREZZO_FORNITORE" FLOAT(53) NULL DEFAULT NULL,
     "PREZZO_CLIENTE" FLOAT(53) NULL DEFAULT NULL,
     "PREZZO_LISTINO" FLOAT(53) NULL DEFAULT NULL,
     "PREZZO_RETAIL" FLOAT(53) NULL DEFAULT NULL,
     "TOTALE_PREZZO_FORNITORE" FLOAT(53) NULL DEFAULT NULL,
     "TOTALE_PREZZO_CLIENTE" FLOAT(53) NULL DEFAULT NULL,
     "TOTALE_PREZZO_LISTINO" FLOAT(53) NULL DEFAULT NULL,
     "QTA_TOTALE"  INT NULL DEFAULT NULL,
     "GESTIONE_FORNITORE" VARCHAR(50) NULL DEFAULT NULL,
     "GESTIONE_CLIENTE" VARCHAR(50)NULL DEFAULT NULL,
     "NOME_PRODOTTO" VARCHAR(50)NULL DEFAULT NULL,
     "TIPO_TAGLIA" VARCHAR(50) NULL DEFAULT NULL,
     "MAX_POSITION" INT NULL DEFAULT NULL)

 DECLARE @Script as VARCHAR(8000)

 DECLARE @Max_pos as INT
 DECLARE @i as INT
 DECLARE @iString as VARCHAR(10)
 DECLARE @idExcel as INT


 SET @Script = ''
 SET @i = 1

 SELECT @Max_pos = MAX(POSIZIONE)
    FROM GRIGLIA_TAGLIE

 WHILE @i <= @Max_pos
 BEGIN  
  SET @iString = LTRIM(STR(@i,10))
  SET @Script = @Script + 'ALTER TABLE #temp ADD POSIZIONE_'+@iString+' VARCHAR(100);'
  SET @i = @i + 1
 END

 print @Script

 Exec (@Script)

 INSERT INTO #temp(CODICE_ARTICOLO, MODELLO, ARTICOLO, DESCRIZIONE, MATERIALE, LINE, COLORE, COLORE_2, LG, SESSO, LISTINO_ARTICOLO, PREZZO_RETAIL_ARTICOLO,
       MADE_IN, NOTE, BRAND_ID, STAGIONE_ID, COMPANY_ID, ID_EXCEL, ID_FILE, RIGA_ORDERS, RAGIONE_SOCIALE_FORNITORE, RAGIONE_SOCIALE_CLIENTE,
       PREZZO_FORNITORE, PREZZO_CLIENTE, PREZZO_LISTINO, PREZZO_RETAIL, TOTALE_PREZZO_FORNITORE, TOTALE_PREZZO_CLIENTE, TOTALE_PREZZO_LISTINO, 
       QTA_TOTALE,  GESTIONE_FORNITORE, GESTIONE_CLIENTE, NOME_PRODOTTO, MAX_POSITION)
 SELECT    CODICE_ARTICOLO,
           MODELLO,
           ARTICOLO,
           DESCRIZIONE,
           MATERIALE,
           LINE,
           COLORE,
           COLORE_2,
           LG,
           SESSO,
           PREZZO_LISTINO LISTINO_ARTICOLO,
           PREZZO_RETAIL PREZZO_RETAIL_ARTICOLO,
           MADE_IN,
           NOTE,
           BRAND_ID,
           STAGIONE_ID,   
           COMPANY_ID,
           ID_EXCEL,
           ID_FILE,
           RIGA_ORDERS,
           RAGIONE_SOCIALE_FORNITORE,
           RAGIONE_SOCIALE_CLIENTE,
           PREZZO_FORNITORE,
           PREZZO_CLIENTE,
           PREZZO_LISTINO,
           PREZZO_RETAIL,
           TOTALE_PREZZO_FORNITORE,
           TOTALE_PREZZO_CLIENTE,
           TOTALE_PREZZO_LISTINO,
           QTA_TOTALE,
           GESTIONE_FORNITORE,
           GESTIONE_CLIENTE,
           NOME_PRODOTTO,
           @Max_pos MAX_POSITION
        from orders_excel
   where ID_FILE = @ID_FILE AND
        ORDINE_CREATO = 0

 DECLARE @Id as INT
 DECLARE @IdTaglia as INT
 DECLARE @qtaOrders as INT 
 DECLARE @tipoTaglia as VARCHAR(50)
 DECLARE @valoreTaglia as VARCHAR(50)
 DECLARE @posizione as INT
 DECLARE @updateTemp as VARCHAR(8000)
 DECLARE @updateScript as VARCHAR(max)
 SET @updateScript = ''

 DECLARE Cur1 CURSOR FOR
  SELECT ID_EXCEL
      FROM orders_excel
  WHERE ID_FILE = @ID_FILE

 OPEN Cur1 
 FETCH NEXT FROM Cur1 INTO @idExcel
 WHILE @@FETCH_STATUS = 0
   BEGIN

   DECLARE Cur2 CURSOR FOR
    SELECT a.ID, a.ID_TAGLIA, a.ID_EXCEL, a.QTA_ORDERS,  b.TIPO_TAGLIA, b.VALORE_TAGLIA, b.POSIZIONE
          FROM ORDERS_EXCEL_TAGLIE a, GRIGLIA_TAGLIE b
    WHERE a.ID_TAGLIA = b.ID_TAGLIA and
          ID_EXCEL = @idExcel

   OPEN Cur2 
   FETCH NEXT FROM Cur2  INTO @Id,@IdTaglia,@IdExcel, @qtaOrders, @tipoTaglia,@valoreTaglia, @posizione
   WHILE @@FETCH_STATUS = 0
   BEGIN 
      SET @updateTemp = 'UPDATE #temp SET TIPO_TAGLIA = ''[x]'', POSIZIONE_[y] = ''[z]'' WHERE ID_EXCEL = ''[w]'';'
      SET @updateTemp = REPLACE(@updateTemp,'[x]',@tipoTaglia)
      SET @updateTemp = REPLACE(@updateTemp,'[y]',@posizione)
      SET @updateTemp = REPLACE(@updateTemp,'[z]',@qtaOrders)
      SET @updateTemp = REPLACE(@updateTemp,'[w]',@IdExcel)
      SET @updateScript = @updateScript + @updateTemp 
    FETCH NEXT FROM Cur2 INTO @Id,@IdTaglia,@IdExcel, @qtaOrders, @tipoTaglia,@valoreTaglia, @posizione
   END
   CLOSE Cur2
   DEALLOCATE Cur2
   FETCH NEXT FROM Cur1 INTO @idExcel
 END
 PRINT @updateScript
 SELECT @sys = CONVERT(varchar, SYSDATETIME(), 121) 
 PRINT @sys
 Exec (@updateScript)
 CLOSE Cur1
 DEALLOCATE Cur1
 SELECT @sys = CONVERT(varchar, SYSDATETIME(), 121) 
 PRINT @sys
 SELECT * FROM #temp
 RETURN;
END

我们正在尝试这样做:

    from django.db import connection

    cursor = connection.cursor()
    procedure = 'EXEC prova_excel %s' % orderBrand.id_file
    cursor.execute(procedure)
    grid = cursor.fetchall()

但它返回一个错误:

Traceback (most recent call last):
  File "C:\Program Files\eclipse indigo\plugins\org.python.pydev.debug_2.5.0.2012040618\pysrc\pydevd.py", line 1346, in <module>
    debugger.run(setup['file'], None, None)
  File "C:\Program Files\eclipse indigo\plugins\org.python.pydev.debug_2.5.0.2012040618\pysrc\pydevd.py", line 1060, in run
    pydev_imports.execfile(file, globals, locals) #execute the script
  File "C:\Users\rzuccotti\workspace\FIRST_ANDREA\interlem\dao\orderDao.py", line 3159, in <module>
    print cursor.fetchall()
  File "C:\Python27\lib\site-packages\django\db\utils.py", line 106, in inner
    return func(*args, **kwargs)
  File "C:\Python27\lib\site-packages\django\db\utils.py", line 99, in exit
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "C:\Python27\lib\site-packages\django\db\utils.py", line 106, in inner
    return func(*args, **kwargs)
  File "C:\Python27\lib\site-packages\sqlserver_ado\dbapi.py", line 688, in fetchall
    return self._fetch()
  File "C:\Python27\lib\site-packages\sqlserver_ado\dbapi.py", line 642, in _fetch
    self._raiseCursorError(FetchFailedError, 'Attempting to fetch from a closed connection or empty record set')
  File "C:\Python27\lib\site-packages\sqlserver_ado\dbapi.py", line 466, in _raiseCursorError
    eh(self.connection, self, errorclass, errorvalue)
  File "C:\Python27\lib\site-packages\sqlserver_ado\dbapi.py", line 91, in standardErrorHandler
    raise errorclass(errorvalue)
django.db.utils.Error: Attempting to fetch from a closed connection or empty record set

你能帮我们吗?你知道吗

谢谢你。你知道吗


Tags: pyiddefaultasnullintsetdeclare