【问题标题】:Getting a sequence number from Oracle DB in Python cx_Oracle在 Python cx_Oracle 中从 Oracle DB 获取序列号
【发布时间】:2020-08-04 10:51:29
【问题描述】:

我正在尝试获取 Oracle 序列的下一个值。

def get_change_id():
    # get a sequence number for each change, this will be used to group before and after changes

    id = cursor_analytics.var(cx_Oracle.NUMBER)

    sql = "select SNAPSHOT_GENERAL_SEQ.nextval into :next_id from sys.dual"
    cursor_analytics.execute(sql, {"next_id":id})

    change_id = id.getvalue()

    return change_id

我收到此错误消息:

Traceback (most recent call last):
  File "C:/ariel_deltas/main.py", line 93, in <module>
    print(get_change_id())
  File "C:\ariel_deltas\snapshot.py", line 125, in get_change_id
    cursor_analytics.execute(sql, {"next_id":id})
cx_Oracle.DatabaseError: ORA-01036: illegal variable name/number

如果我在 SQL 周围加上 begin 和 end,我会得到:

def get_change_id():
    # get a sequence number for each change, this will be used to group before and after changes

    id = cursor_analytics.var(cx_Oracle.NUMBER)

    sql = """"
        BEGIN
            select SNAPSHOT_GENERAL_SEQ.nextval into :next_id from sys.dual;
        END
        """

    cursor_analytics.execute(sql, {"next_id":id})

    change_id = id.getvalue()

    return change_id

Traceback(最近一次调用最后一次):文件“C:/ariel_deltas/main.py”, 第 93 行,在 print(get_change_id()) 文件“C:\ariel_deltas\snapshot.py”,第 130 行,在 get_change_id cursor_analytics.execute(sql, {"next_id":id}) cx_Oracle.DatabaseError: ORA-01740: 在标识符中缺少双引号

这样做可行,但感觉不对:

def get_change_id():
    # get a sequence number for each change, this will be used to group before and after changes

    sql = 'select SNAPSHOT_GENERAL_SEQ.nextval from sys.dual'

    cursor_analytics.execute(sql)

    for row in cursor_analytics.fetchall():
        r = reg(cursor_analytics, row, False)
        change_id = r.NEXTVAL
        return change_id

    

【问题讨论】:

    标签: python oracle cx-oracle


    【解决方案1】:

    您在第二个函数中收到错误“标识符中缺少双引号”,因为您在多行字符串的开头使用了四个双引号字符而不是三个:

        # ----1234
        sql = """"
            BEGIN
            ...
            """
    

    第四个" 最终成为发送给Oracle 的字符串的第一个字符,并且字符串中没有其他" 字符,因此出现关于缺少双引号的错误。删除它,这个功能应该开始工作了。

    您的第一个函数将不起作用,因为 SELECT 查询的 INTO 子句仅在 PL/SQL 中受支持。

    最后,除非您使用的是旧版本的 Oracle(我认为是 11g 或更早版本),否则您可以直接分配下一个序列值而无需使用查询:

        sql = """
            BEGIN
                :next_id := SNAPSHOT_GENERAL_SEQ.nextval;
            END;
            """
    

    【讨论】:

    • 将 PL/SQL 解决方案与 (change_id,) = cursor_analytics.execute("select SNAPSHOT_GENERAL_SEQ.nextval from dual").fetchone() 进行基准测试会很有趣。 (也可能在事先将cursor_analytics.arraysize 设置为 1 之后)。
    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2013-10-31
    相关资源
    最近更新 更多