【问题标题】:Asking for a date to be input by user using cx_Oracle in Python Pandas vs. PL/SQL要求用户在 Python Pandas 与 PL/SQL 中使用 cx_Oracle 输入日期
【发布时间】:2022-08-19 05:48:05
【问题描述】:

我有一个在 PL/SQL 中完美运行的查询,我要求用户输入一个日期,它说:

select * from X (X is a table in a database called DATABASE which I am connected to)
where date_=TO_DATE(\'&Enter_Date\',\'YYYY-MM-DD\')

我尝试使用以下方法在 Python 和 cx_Oracle 中复制它:

import cx_Oracle

db2 = cx_Oracle.connect(\'/@DATABASE\')
positions = \"\"\"

SELECT * FROM X 

WHERE date_=TO_DATE(\'&Enter_Date\',\'YYYY-MM-DD\')

\"\"\"

我得到一个错误。 :ORA-01841:(完整)年份必须介于 -4713 和 +9999 之间,而不是 0。如果我实际上在日期中编码,例如 \'2022-06-30\',它可以工作,但我希望用户是可以输入。

感谢您能给我的任何帮助。 谢谢,

    标签: python date cx-oracle


    【解决方案1】:

    字符串中的“&”由 SQL*Plus 处理并被视为输入值,但 Python 不会发生这种情况。相反,您必须使用内置的input() 请求用户输入,然后将其传递给数据库。如下所示:

    # import oracledb # python-oracledb
    import cx_Oracle as oracledb
    
    conn = oracledb.connect(user="USER", password="PASSWORD", dsn="DSN")
    user_val = input("Enter Date: ")
    cursor = conn.cursor()
    cursor.execute("select * from x where date_ = to_date(:val, 'YYYY-MM-DD')",
                   val=user_val)
    

    如果需要,您还可以使用 Python 例程将用户输入的值转换为 Python 日期并将其传递到数据库(避免 to_date() 调用)。

    【讨论】:

    • 不幸的是,当我尝试它时 - 它给了我一个找不到表格的错误。我还尝试在 val 之前使用 : otut ,然后它找到了表格,但它给了我一个变量错误。
    • 需要冒号,因为它是“绑定变量”语法,请参阅doc。删除它会导致 Python 在语句发送到数据库之前出错。您应该验证您以正确的用户身份连接到正确的数据库,并验证您的表名和列名。
    • 我让它工作了。我可以使用我拥有的代码并进行 2 处更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    相关资源
    最近更新 更多