【问题标题】:Using cx_Oracle with an IN statement (Python 3)使用带有 IN 语句的 cx_Oracle (Python 3)
【发布时间】:2019-02-11 23:53:21
【问题描述】:

我正在尝试使用 cx_Oracle 将参数传递到 SQL“IN”语句中。这给出了正确的结果:

sql = """select * from
           (select level numb from dual connect by level <= 4)
         where numb = :var"""

print([row[0] for row in cur.execute(sql, (1,))])
Output: [1]

但是我一直无法弄清楚如何使用“IN”语句。

sql = """select * from
           (select level numb from dual connect by level <= 4)
         where numb in :var"""

print([row[0] for row in cur.execute(sql, (1, 2))])
Output: cx_Oracle.DatabaseError: ORA-01036: illegal variable name/number

我已经尝试过 IN 语句的变体,也尝试过使用字典来传递参数。

【问题讨论】:

    标签: python python-3.x oracle cx-oracle bind-variables


    【解决方案1】:

    当使用单个值或文字时,SQL 中的IN 子句需要用括号括起来的值。由于您传递了两个参数,因此请在括号中包含两个占位符。

    sql = """select * from
               (select level numb from dual connect by level <= 4)
             where numb in (:1, :2)"""
    
    print([row[0] for row in cur.execute(sql, (1, 2))])
    

    【讨论】:

    • 谢谢 Parfait——在运行时可能并不总是知道确切的项目数量,所以我想知道是否有办法让 IN 动态识别一个或多个值。
    • 是的,您可以根据项目的数量动态构建准备好的 SQL 语句(如 Python 中的任何字符串)。但是您上面的问题中没有提到这方面。
    • 处理未知数量 IN 参数的通用解决方案和链接在 oracle.github.io/node-oracledb/doc/api.html#sqlwherein 我知道这是针对不同语言的,但这些解决方案适用于 cx_Oracle、PHP OCI8 和其他语言的 API。
    猜你喜欢
    • 1970-01-01
    • 2019-10-30
    • 2021-07-02
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多