在以下语句中字典中的bindind日期有问题吗?
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:literal与格式字符串
不匹配掌握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)
工作得很好??
由于
答案 0 :(得分:1)
您的第一个查询不起作用,因为cx_Oracle正在尝试将giftcardnbr
和giftcard_amt
绑定到不存在的绑定变量。
如果我在Cursor.execute()
调用中绑定了正确数量的变量,一切都很好:
>>> 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()
[]