2017-10-04 93 views
0

我需要使用返回結果作爲refcursor的日期查詢對象,如果我只是將日期添加到函數中我得到返回(日期不是可定製的)。我試着發送時間只是作爲一個字符串,並且不工作要麼,我得到我使用如何調用過程使用cx_Oracle輸入日期輸入返回遊標

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; 

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中 一個ORA-01830: date format picture ends before converting entire input string

程序客戶:12.1.0.2 任何幫助,將不勝感激。

回答

0

想通了,這要歸功於同事 ret_cursor應該是callproc返回的元組中的最後一項。因此,而不是[0],我們應該有[-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)