Я пытаюсь использовать оператор return в cx_ oracle (версия 7.3), чтобы получить идентификаторы, сгенерированные последовательностью в одной из моих таблиц. Однако я не получаю значение поля последовательности, которое я ожидаю. Мне нужно значение an_ash_s.nextval
Вызов моей функции выглядит следующим образом:
self.insert_into_columns_with_return('AN_SHIPMENT', payload.shipment_columns, payload.shipment_rows, id_sequence='an_ash_s.nextval')
, где payload.shipment_columns выглядит как
['ASH_ID', 'ASH_AJ_ID', 'ASH_CD_PROCESS_STATUS', 'ASH_PROCESS_ID', 'ASH_SHIPMENT_KEY', 'ASH_ORG_OPERATIONAL_ID', 'ASH_SEED_EQUIP', 'ASH_SEED_EQUIP_CODE', 'ASH_SHIP_DATE', 'ASH_SHIP_DATE_DSP', 'ASH_SHIP_DIRECTION', 'ASH_SHIP_DIRECTION_DSP', 'ASH_FREIGHT_TERMS', 'ASH_FREIGHT_TERMS_DSP', 'ASH_WEIGHT', 'ASH_WEIGHT_MEASURE', 'ASH_HAZ_FLAG', 'ASH_CREATE_DATE', 'ASH_PACKAGE_COUNT', 'ASH_SHIPPING_CLASS_ID', 'ASH_SHIPPING_CLASS_TYPE', 'ASH_ORG_CONSIGNOR_ID', 'ASH_ORG_CONSIGNOR_NAME', 'ASH_LOC_ORIG_ID', 'ASH_LOC_ORIG_COUNTRY_ID', 'ASH_LOC_ORIG_STATE_CODE', 'ASH_LOC_ORIG_CITY', 'ASH_LOC_ORIG_POSTAL_CODE', 'ASH_ORG_CONSIGNEE_ID', 'ASH_ORG_CONSIGNEE_NAME', 'ASH_LOC_DEST_ID', 'ASH_LOC_DEST_COUNTRY_ID', 'ASH_LOC_DEST_STATE_CODE', 'ASH_LOC_DEST_CITY', 'ASH_LOC_DEST_POSTAL_CODE', 'ASH_ERROR_MESSAGE', 'ASH_USE_CURRENT_DATE']
И строки отгрузки полезной нагрузки выглядят следующим образом:
[[310, '5', None, 'Test', '*ISP_CLT', 'LTL', 'LTL', datetime.date(2019, 4, 15), '03/15/2019', 'I', 'Inbound', 'P', 'Pre-Paid', 3000, 'LB', 'N', datetime.date(2019, 3, 24), None, '70', None, None, None, '241144', 'US', 'GA', 'ANYTOWN', '25451', None, None, '12345', 'US', 'VA', 'BANKS', '45678', None, 'N']]
На основании полученных отзывов я изменил свою функцию так, чтобы она выглядела следующим образом:
def insert_into_columns_with_return(self, table_name, columns, rows, id_sequence=None):
arrstr = rows
col_str = ''
for col_id in range(1, len(columns) + 1):
col_str += columns[col_id - 1]
if col_id < len(columns):
col_str += ', '
with self.conn.cursor() as cur:
intCol = cur.var(int)
childIdVar = cur.var(int, arraysize=len(arrstr))
cur.setinputsizes(None, childIdVar)
if(id_sequence == None):
sql = "INSERT INTO {table_name} ({column_names}) VALUES (:arrstr) RETURNING ASH_ID INTO :intCol"
sql = sql.format(table_name=table_name, column_names =col_str)
elif (id_sequence != None):
sql = "INSERT INTO {table_name} ({column_names}) VALUES ( {id_sequence}, :arrstr ) RETURNING ASH_ID INTO :intCol"
sql = sql.format(table_name=table_name, column_names=col_str, id_sequence=id_sequence)
cur.executemany(sql, [tuple(x) for x in arrstr])
for ix, stri in enumerate(arrstr):
print("IDs Str", stri, "is", childIdVar.getvalue(ix))
self.conn.commit()
Однако теперь я получаю сообщение об ошибке cx_Oracle.DatabaseError: ORA-01036: illegal variable name/number
Я думал, что цель заключалась в том, чтобы выполнить feed многие из списка кортежей, но я думаю, что он его не принимает.