programing

Oracle DB 12c에서 가장 최근 삽입의 ID를 검색하는 중

telecom 2023. 10. 12. 21:48
반응형

Oracle DB 12c에서 가장 최근 삽입의 ID를 검색하는 중

삽입하는 행에 대해 생성된 ID 값을 (python의 cx_oracle을 통해) 반환하고 싶습니다.새로 생성된 행의 ID를 얻기 위해 제 SQL 문을 수정하는 방법을 알려주시면 제가 파이썬 비트를 스스로 알아낼 수 있을 것 같습니다.

다음과 같은 것으로 만들어진 테이블이 있습니다.

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 이하에 대한 것이었는데, 이 버전은 자동으로 생성된 ID 열을 지원하지 않으므로 여기 있는 누군가가 도움을 줄 수 있기를 바랍니다.

user2502422가 위에서 말한 것을 가져와서 파이썬 비트를 추가하는 것:

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()

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 }

삽입문의 반환 절을 사용합니다.

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

파이썬 비트를 다룰 수 있다고 했죠?프로그램에서 반환 매개변수를 "바인딩"할 수 있어야 합니다.

마르코 폴로의 답변은 좋았지만 미완성입니다.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))

오래된 대답에 동의합니다.그러나 cx_Oracle(7.0 이상) 버전에 따라var.getvalue()스칼라 대신 배열을 반환할 수 있습니다.이는 본 의견에 명시된 바와 같이 복수의 반환 값을 지원하기 위함입니다.

또한 cx_Oracle이 더 이상 사용되지 않으며 지금 oracleb로 이동했습니다.

예:

newId = cur.var(oracledb.NUMBER, outconverter=int)
sql = """insert into Locations(latitude, longitude) values (:latitude, :longitude) returning locationId into :newId"""
sqlParam = [latitude, longitude, newId]
cur.execute(sql, sqlParam)
newIdValue = newId.getvalue()

newIdValue돌아올 것입니다[1]대신에1

언급URL : https://stackoverflow.com/questions/35327135/retrieving-identity-of-most-recent-insert-in-oracle-db-12c

반응형