在Python cx_Oracle中从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 :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_deltassnapshot.py", line 125, in get_change_id
cursor_analytics.execute(sql, {"next_id":id})
cx_Oracle.DatabaseError: ORA-01036: illegal variable name/number

如果我在SQL周围包装一个开始和结束,我会得到:

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(最近调用last(:文件;C:/ariel_deltas/main.py";,第93行,inprint(get_change_id(((文件"C: \ariel_deltas\snapshot.py";,第130行,在get_change_id中cursor_analytics.execute(sql,{quot;next_id;:id}(cx_Oracle。数据库错误: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 = """"
BEGIN
...
"""

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

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

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

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

最新更新