2016-11-09 27 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:リテラル

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

が正常に動作しますオラクルのPythonを習得から、フォーマット文字列

と一致していません?

おかげ

答えて

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'は日付ではないため、2番目の呼び出しに失敗しました。これは文字列です(以前の回答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() 
[] 
関連する問題