在Python cx_Oracle中从Oracle数据库获取序列号

在Python cx_Oracle中从Oracle数据库获取序列号,python,oracle,cx-oracle,Python,Oracle,Cx Oracle,我正在尝试获取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 :nex

我正在尝试获取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
我收到以下错误消息:

回溯最近一次调用:文件C:/ariel_deltas/main.py, 第93行,在 printget\u change\u id文件C:\ariel\u deltas\snapshot.py,第130行,在get\u change\u id中 cursor_analytics.executesql,{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

    

在第二个函数中,由于在多行字符串的开头使用了四个双引号字符,而不是三个双引号字符,因此出现标识符中缺少双引号的错误:

--1234 sql= 开始 ... 第四个字符是发送给Oracle的字符串的第一个字符,并且字符串中没有其他字符,因此出现了缺少双引号的错误。删除它,此功能将开始工作

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

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

sql= 开始 :next_id:=快照_常规_SEQ.nextval; 终止
将PL/SQL解决方案与change\u id、=cursor\u analytics.executeselect SNAPSHOT\u GENERAL\u SEQ.nextval(来自dual.fetchone)进行基准测试会很有趣。也可能是在事先设置为1之后。
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
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