cx_ oracle возвращение с выполни много, не давая ожидаемого результата - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь использовать оператор 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 многие из списка кортежей, но я думаю, что он его не принимает.

1 Ответ

0 голосов
/ 24 апреля 2020

Поскольку ваш код не является полным и пригодным для использования, я попробовал следующий бит кода, взятый из do c здесь

cursor = con.cursor()
intCol = cursor.var(int)
arrstr=[ ("First" ),
         ("Second" ),
         ("Third" ),
         ("Fourth" ),
         ("Fifth" ),
         ("Sixth" ),
         ("Seventh" ) ]
print("Adding rows", arrstr)
print(intCol.getvalue())
childIdVar = cursor.var(int, arraysize=len(arrstr))
cursor.setinputsizes(None, childIdVar)
cursor.executemany("insert into treturn values (tret.nextval, :arrstr) returning c1 into :intCol", 
        [(i,) for i in arrstr])
for ix, stri in enumerate(arrstr):
    print("IDs Str", stri, "is",
            childIdVar.getvalue(ix))

, и я получаю этот вывод

Adding rows ['First', 'Second', 'Third', 'Fourth', 'Fifth', 'Sixth', 'Seventh']
None
IDs Str  First is [24]
IDs Str  Second is [25]
IDs Str  Third is [26]
IDs Str  Fourth is [27]
IDs Str  Fifth is [28]
IDs Str  Sixth is [29]
IDs Str  Seventh is [30]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...