【问题标题】:cx_Oracle 'SELECT INTO' bind variable issue - ORA-01036: illegal variable name/numbercx_Oracle 'SELECT INTO' 绑定变量问题 - ORA-01036:非法变量名称/编号
【发布时间】:2020-08-07 20:34:03
【问题描述】:

我收到以下代码的“非法变量名”错误。一个是 out 参数,不确定此语法是否适用于 out 参数,但也尝试了一些变体,包括使用 :1, :2 语法传递值元组 - 这也不起作用。

def no_snapshot_for_day(timestamp):
    # Do we have a snaphot already today
    no_snapshot = True
    snapshot_count = cursor_analytics.var(cx_Oracle.NUMBER)

    sql = "SELECT COUNT(1) INTO :v1 FROM PYTHON_SNAPSHOT WHERE SNAPSHOT_DATE=trunc(:v2) AND SNAPSHOT_STATUS='OK'"

    cursor_analytics.execute(sql,{"v1":snapshot_count, "v2":timestamp})


    if snapshot_count.getvalue() > 0:
        no_snapshot = False

    return no_snapshot

【问题讨论】:

    标签: python oracle cx-oracle


    【解决方案1】:

    'select into' 是一种 PL/SQL SQL 语法。从技术上讲,您可以执行

    sql = "BEGIN SELECT COUNT(1) INTO :v1 FROM PYTHON_SNAPSHOT WHERE SNAPSHOT_DATE=trunc(:v2) AND SNAPSHOT_STATUS='OK'; END;"
    

    但在实践中,只需执行“选择”,然后获取数据,类似于以下(未经测试的)代码:

    with connection.cursor() as cursor_analytics:
        sql = "SELECT COUNT(1) as snapshot_count FROM PYTHON_SNAPSHOT WHERE SNAPSHOT_DATE=trunc(:v2) AND SNAPSHOT_STATUS='OK'"
        cursor_analytics.execute(sql,{"V2": timestamp})
        (snapshot_count,) = cursor_analytics.fetchone()
        print(snapshot_count)
    
    

    【讨论】:

    • 哦,是的,我想我之前解决了这个问题,只是将开始和结束环绕 SQL
    • 这不太可能是技术上最有效的解决方案。
    • 必须比创建记录集和提取更高效
    • 也许,也许不是。使用 cx_Oracle 8 中的默认设置,对于单行查询,“获取”是本地调用,因此无需额外往返数据库。见cx-oracle.readthedocs.io/en/latest/user_guide/tuning.html
    猜你喜欢
    • 1970-01-01
    • 2013-01-06
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 2016-04-03
    • 2021-02-13
    • 1970-01-01
    相关资源
    最近更新 更多