检索Oracle DB 12c中最新插入的标识

时间:2016-02-10 22:22:21

标签: python oracle oracle12c

我想回到我(通过python中的cx_oracle)为我正在插入的行创建的Identity的值。我想我可以自己找出python位,如果有人可以请说明如何修改我的SQL语句以获取新创建的行的ID。

我有一个用以下内容创建的表:

CREATE TABLE hypervisor
  (
    id NUMBER GENERATED BY DEFAULT AS IDENTITY (
    START WITH 1 NOCACHE ORDER ) NOT NULL ,
    name       VARCHAR2 (50)
  )
  LOGGING ;
ALTER TABLE hypervisor ADD CONSTRAINT hypervisor_PK PRIMARY KEY ( id ) ;

我有类似于以下内容的SQL:

insert into hypervisor ( name ) values ('my hypervisor')

是否有一种简单的方法可以获得新插入行的id

,如果可能,我很乐意修改我的SQL语句以使其返回。

此问题上的大部分谷歌点击都是针对版本11及更低版本,不支持自动生成的标识列,所以希望有人可以提供帮助。

4 个答案:

答案 0 :(得分:7)

取上面所述的user2502422并添加python位:

newest_id_wrapper = cursor.var(cx_Oracle.STRING)
sql_params = { "newest_id_sql_param" : newest_id_wrapper }
sql = "insert into hypervisor ( name ) values ('my hypervisor') " + \             
      "returning id into :python_var"
cursor.execute(sql, sql_params)
newest_id=newest_id_wrapper.getvalue()

答案 1 :(得分:4)

使用insert语句的returns子句。

insert into hypervisor (name ) values ('my hypervisor')
 returning id into :python_var

你说你可以处理Python位吗?您应该能够“绑定”程序中的返回参数。

答案 2 :(得分:3)

这个取自learncodeshare.net的例子帮助我掌握了正确的语法。

cur = con.cursor()

new_id = cur.var(cx_Oracle.NUMBER)

statement = 'insert into cx_people(name, age, notes) values (:1, :2, :3) returning id into :4'
cur.execute(statement, ('Sandy', 31, 'I like horses', new_id))

sandy_id = new_id.getvalue()

pet_statement = 'insert into cx_pets (name, owner, type) values (:1, :2, :3)'
cur.execute(pet_statement, ('Big Red', sandy_id, 'horse'))

con.commit()

这与ragerdl的回答略有不同,但我相信这里添加的不同之处! 请注意缺少sql_params = { "newest_id_sql_param" : newest_id_wrapper }

答案 3 :(得分:0)

我喜欢马可波罗的答案,但它不完整。 FelDev的答案也很好,但没有解决命名参数问题。 这是我用简化表(较少字段)编写的代码中更完整的示例。我省略了有关如何设置游标的代码,因为这在其他地方有很好的记录。

import cx_Oracle

INSERT_A_LOG = '''INSERT INTO A_LOG(A_KEY, REGION, DIR_NAME, FILENAME)
VALUES(A_KEY_Sequence.nextval, :REGION, :DIR_NAME, :FILENAME)
RETURNING A_KEY INTO :A_LOG_ID'''

CURSOR = None

class DataProcessor(Process):
    # Other code for setting up connection to DB and storing it in CURSOR
    def save_log_entry(self, row):
        global CURSOR
        # Oracle variable to hold value of last insert
        log_var = CURSOR.var(cx_Oracle.NUMBER)
        row['A_LOG_ID'] = log_var

        row['REGION'] = 'R7' # Other entries set elsewhere
        try:
            # This will fail unless row.keys() = 
            # ['REGION', 'DIR_NAME', 'FILE_NAME', 'A_LOG_ID']
            CURSOR.execute(INSERT_A_LOG, row)
        except Exception as e:
            row['REJCTN_CD'] = 'InsertFailed'
            raise

        # Get last inserted ID from Oracle for update
        self.last_log_id = log_var.getvalue()
        print('Insert id was {}'.format(self.last_log_id))