Ошибка: неверный синтаксис с использованием cx_ oracle в python - PullRequest
0 голосов
/ 16 июня 2020

Код ниже предназначен для извлечения данных из базы данных oracle в файл csv. В запросе для преобразования из дробного десятичного числа в формат даты я использовал To_Date('12/30/1899', 'MM/DD/YYYY HH24:MI:SS')+DTIMESTAMP) Decoded_Date.

И также указал диапазон дат для извлечения данных между датами. Пожалуйста, помогите, что не так в приведенном ниже коде дает неверный синтаксис.

import csv
import cx_Oracle
dsn_tns = cx_Oracle.makedsn('hostname', 'port', sid='sid') # if needed, place an 'r' before any parameter in order to address special characters such as '\'.
conn = cx_Oracle.connect(user=r'username', password='password', dsn=dsn_tns)
cursor = conn.cursor()
csv_file = open("C:/Users/locations.csv", "w")
writer = csv.writer(csv_file, delimiter=',', lineterminator="\n", quoting=csv.QUOTE_NONNUMERIC)
r = cursor.execute("""SELECT * 
                        FROM (SELECT LROWNUM,DTIMESTAMP,LSCENARIO,LYEAR,LPERIOD,
                                     LENTITY,LPARENT,LVALUE,LACCOUNT,LICP,LCUSTOM1,
                                     LCUSTOM2,STRUSERNAME,STRSERVERNAME,
                                     LACTIVITY,DDATAVALUE,BNODATA,
                                     (To_Date('12/30/1899', 'MM/DD/YYYY HH24:MI:SS')+DTIMESTAMP) Decoded_Date
                                FROM TABLE_NAME
                             ) SUB
                       WHERE SUB.Decoded_Date between '23-MAR-2020' and '24-APR-2020';
    """)
for row in cursor:
    writer.writerow(row)

cursor.close()
conn.close()
csv_file.close()

1 Ответ

1 голос
/ 16 июня 2020

Открывающая и закрывающая круглые скобки присутствовать не должны. Я, конечно, не могу протестировать SQL напрямую, но теоретически это должно сработать для вас!

    r = cursor.execute"""
            SELECT * 
            FROM
                ( SELECT LROWNUM,DTIMESTAMP,LSCENARIO,LYEAR,LPERIOD,
                      LENTITY,LPARENT,LVALUE,LACCOUNT,LICP,LCUSTOM1,
                      LCUSTOM2,STRUSERNAME,STRSERVERNAME,
                      LACTIVITY,DDATAVALUE,BNODATA,
                      To_Date('12/30/1899','MM/DD/YYYY') +
                          DTIMESTAMP as Decoded_Date
                  FROM TABLE_NAME
                ) SUB
            WHERE SUB.Decoded_Date between to_date('23-MAR-2020', 'DD-MON-YYYY')
                  and to_date('24-APR-2020', 'DD-MON-YYYY')
    """

Обратите внимание на изменения в последней строке. Если вы не знаете значение NLS_DATE_FORMAT, вы не можете напрямую сравнивать строки с датами. Обратите внимание, что вы также можете напрямую привязать значения даты, как в

sql = "select ... where sub.decoded_date between :1 and :2"
cursor.execute(sql, [datetime.date(2020, 3, 23), datetime.date(2020, 4, 24)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...