2017-07-19 8 views
0

Ich möchte das Ergebnis dieser Abfrage einer Variablen zuweisen und diese Variable als Makrovariable in einer anderen SQL-Abfrage verwenden.SQL-Abfrageergebnis einer Makrovariablen in Python zuweisen

erste Abfrage:

start_week = 201619 

start_date=connection.execute(""" 
select min(CAST(date_id as DATE)) as start_date from date_table 
where CAST(week_id as INT) = %d 
""" 
%(start_week)) 

start_date = start_date.fetchone() 

Das Ergebnis dieser Abfrage ist: (datetime.datetime (2017, 7, 2, 0, 0),)

2. Abfrage: Jetzt will ich nutzen dies als eine Makrovariable in der zweiten Abfrage

start_wk=connection.execute(""" 
select fis_week_id as start_wk from date_dim 
where date_id = %s 
""" 
%(start_date)) 

Allerdings bekomme ich einen Fehler wie:

DatabaseError: (cx_Oracle.DatabaseError) ORA-00936: missing expression 
[SQL: '\nselect week_id as start_wk from date_dim\nwhere date_id = (datetime.datetime(2016, 7, 4, 0, 0),)\n'] 

Ich würde mich freuen, wenn mir jemand zeigt, wie man das macht?

Danke!

Antwort

0

Formatieren Sie die Datetime einfach in eine Zeichenfolge im Format: , die RDBMS als Datetime liest. Übergeben Sie das Datum außerdem als einen Parameter, der nicht in der SQL-Zeichenfolge interpoliert wird. Siehe Oracle+Python Best Practices:

str_start_date = datetime.datetime.strftime(start_date[0], '%Y-%m-%d') 

cur = connection.cursor() 

start_wk = cur.execute(""" 
    select fis_week_id as start_wk 
    from date_dim 
    where date_id = to_date(:sdate, 'yyyy-mm-dd')""", {'sdate':str_start_date}) 

cur.close() 

Allerdings betrachten beide Abfragen ohne Notwendigkeit eines Vermittlers variable Kombination von wo erste Abfrage WHERE Klausel eine Unterabfrage in der zweiten Abfrage wird:

cur = connection.cursor() 

start_wk = cur.execute(""" 
    select fis_week_id as start_wk 
    from date_dim 
    where date_id = (select min(CAST(date_id as DATE)) as start_date 
        from date_table 
        where CAST(week_id as INT) = :sweek)""", {'sweek':start_week}) 
cur.close() 
+0

Sie etwas sagen wollen? Bitte poste den Fehler (normalerweise die letzten Zeilen des Tracebacks) und nicht den Code. Und warum benutzt du das Cursor-Objekt nicht für 'execute()'? – Parfait

+0

hi- Wenn ich die erste Abfrage ausführen, erhalte ich diesen Fehler: DatabaseError: (Cx_Oracle.DatabaseError) ORA-01861: Literal stimmt nicht überein Format Zeichenfolge [SQL: '\ n wählen fis_week_id als start_wk \ n von date_dim \ n wo date_id =: sdate '] [Parameter: {' sdate ':' 2016-07-04 '}] –

+0

Siehe Aktualisierung. Für Oracle müssen Sie datetime strings mit 'to_date()' umschließen. – Parfait

Verwandte Themen