2017-10-04 6 views
0

Je dois interroger un objet en utilisant une date où les résultats sont renvoyés en tant que refcursor, si je viens d'ajouter la date à la fonction je suis retourné (date n'est pas itérable). J'ai essayé d'envoyer le temps comme une chaîne et que le travail ne marche pas non plus, je reçois un ORA-01830: date format picture ends before converting entire input stringcomment appeler procédure retournant le curseur avec une entrée de date en utilisant cx_Oracle

procédure

J'utilise

PROCEDURE prc_get_some_data(
    p_date   IN DATE, 
    p_cursor  OUT SYS_REFCURSOR) 
IS 
BEGIN 
    DBMS_APPLICATION_INFO.SET_CLIENT_INFO ('Python Script'); 
    OPEN p_cursor FOR 
     SELECT * 
     FROM table 
     WHERE creates = p_date; 
EXCEPTION 
    WHEN OTHERS 
     THEN 
      DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_STACK); 
      DBMS_OUTPUT.PUT_LINE(CHR(10)); 
      DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE); 
END prc_get_somedatas; 

base de données script python

import sys, time 
from datetime import date, timedelta 
import random 
import cx_Oracle 
import string 

# Python Script to call a PL/SQL stored procedure to bulk load data 


class Test: 
    def __enter__(self): 
     self.__db = cx_Oracle.connect('/@wallet_string') 
     self.__cursor = self.__db.cursor() 
     return self 

    def __exit__(self, type, value, traceback): 
     self.__cursor.close() 
     self.__db.close() 


    def get_some_data(self): 
     d=date.today() # Initialize a date variable with date of today 

     db_start = time.time() 
     start_all = time.time() 

     self.__cursor.bindarraysize = 2500 
     self.__cursor.arraysize = 10000 

     # create a cursor variable to return the results into 
     l_cur = self.__cursor.var(cx_Oracle.CURSOR) 

     #execute the procedure 
     l_test = self.__cursor.callproc("prc_get_some_data",[datetime.strptime("2007-12-31 23:59:59", "%Y-%m-%d %H:%M:%S"), l_cur])[0] 


     db_elapsed = (time.time() - db_start) 
     total_elapsed = (time.time() - start_all) 

     print "DB:\t ", db_elapsed, " seconds" 
     print "Total:\t ", total_elapsed, " seconds" 

     return list(l_test) 



if __name__ == "__main__": 

    with Test() as mydbconn: 
     for row in mydbconn.get_corporate_actions_equities(): 
      print row 

oracle 12c client: 12.1.0.2 toute aide serait appréciée.

Répondre

0

trouvé grâce à un collègue ret_cursor devrait être le dernier élément dans le tuple retourné par callproc. Donc, au lieu de [0], nous devrions avoir [-1].

def get_some_data(self): 
    d=date.today() # Initialize a date variable with date of today 

    db_start = time.time() 
    start_all = time.time() 

    self.__cursor.bindarraysize = 2500 
    self.__cursor.arraysize = 10000 

    # create a cursor variable to return the results into 
    l_cur = self.__cursor.var(cx_Oracle.CURSOR) 

    #execute the procedure 
    rep_date = date(2017,07,20) 
    l_test = self.__cursor.callproc("prc_get_some_data",[rep_date, l_cur])[-1] 


    db_elapsed = (time.time() - db_start) 
    total_elapsed = (time.time() - start_all) 

    print "DB:\t ", db_elapsed, " seconds" 
    print "Total:\t ", total_elapsed, " seconds" 

    return list(l_test)