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
'programing' 카테고리의 다른 글
전문 jQuery 기반 콤보박스 제어? (0) | 2023.10.12 |
---|---|
구독 전환 - 카트에 직접 추가 (0) | 2023.10.12 |
Emacs C++, 해당 헤더 파일 열기 (0) | 2023.10.12 |
HTML로 문자열 렌더링 및 공백 및 줄 바꿈 보존 (0) | 2023.10.12 |
DataGrip JetBrains에서 새 데이터베이스 만들기 (0) | 2023.10.12 |