2016-11-09 45 views
0

在下列語句中,字典中的bindind日期有問題?python cx_Oracle綁定非法變量名

mySQL = 'SELECT day_key FROM timeday WHERE calendar_date =:calendar' 
args = {'calendar':'2016/10/16', 'giftcardnbr': '7777083049519090', 'giftcard_amt': '249.8'} 

cursor.execute(mySQL,args) 

DatabaseError:ORA-01036:非法的變量名/編號

爲什麼會出現這種語法返回不同的錯誤?

cursor.execute('SELECT day_key FROM timeday WHERE calendar_date =:calendar',{'calendar':'2016/10/16'}) 

DatabaseError:ORA-01861:文字不匹配格式字符串

從精通Oracle的Python

named_params = {'dept_id':50, 'sal':1000} 
query1 = cursor.execute('SELECT * FROM employees WHERE department_id=:dept_id AND salary>:sal', named_params) 

正常工作?

感謝

回答

1

因爲cx_Oracle試圖綁定giftcardnbrgiftcard_amt不存在的綁定變量的第一個查詢不起作用。

如果我在​​調用一切綁定變量的正確數字是罰款:

>>> import cx_Oracle 
>>> DB = cx_Oracle.connect('ben/****@s1/s1') 
>>> cur = DB.cursor() 
>>> SQL = "select * from dual where 1 = :a" 
>>> cur.execute(SQL, {'a' : 1}).fetchall() 
[('X',)] 

如果我嘗試一個不存在的變量綁定則無法用同樣的錯誤:

>>> cur.execute(SQL, {'a' : 1, 'b' : 2}).fetchall() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
cx_Oracle.DatabaseError: ORA-01036: illegal variable name/number 

你的第二個電話失敗,因爲'2016/10/16'不是日期,它是一個字符串(請參閱我以前的回答Comparing Dates in Oracle SQL)。

如果我們構建一個日期,然後用它來比較的日期一切都很好:

>>> import datetime 
>>> my_date = datetime.datetime(year=2016, month=10, day=16) 
>>> my_date 
datetime.datetime(2016, 10, 16, 0, 0) 
>>> SQL = "select * from dual where date '2016-01-01' = :calendar" 
>>> cur.execute(SQL, {'calendar' : my_date }).fetchall() 
[]