CX_ Oracle вставить данные, используя переменную / функцию Bind, и также вернуть идентификатор записи - PullRequest
0 голосов
/ 01 февраля 2020

Я пытаюсь создать определение, используя cx_ oracle, чтобы вставить данные в базу данных и получить идентификатор записи. Я искал форум и нашел решение, как показано ниже.

def insert_data(self,SqlQry):
     try:
         idvar=self.__cursor.var(cx_Oracle.NUMBER)
         SqlQry=SqlQry + " returning ID into :vrecord_id"

         self.__cursor.execute(SqlQry,v1='test1',v2='test2',v3='test3',v4='test4', vrecord_id=idvar)
         vid= idvar.getvalue()
         self.__con.commit()
         retuen vid    

     except cx_Oracle.DatabaseError as e:
         return e
         print("Error in data insert")  


print(sql_insertData("INSERT INTO MYTABLE(Field1,Field2,Field3,Field4) VALUES(:v1, :v2, :v3,:v4)")

Это отлично работает, и я могу получить идентификатор. Но я хочу передать значения с помощью оператора sql вместо определения каждого по отдельности, как я это сделал в строке .execute.

cursor.execute(SqlQry,v1='test1',v2='test2',v3='test3',v4='test4', vrecord_id=idvar)

Я хочу изменить текущий оператор печати следующим образом:

print(sql_insertData(
        """INSERT INTO RAP_RISK_TYPE(RISK_HEADER,RISK_TYPE_DISP,RISK_TYPE_DESC,RISK_TYPE_CAT) 
           VALUES
           (:v1, :v2, :v3,:v4)""", ['newvalue1','newvalue2','newvalue3','newvalue4']

Но если я делаю это, как я пишу инструкцию execute для получения идентификатора, я получаю ошибку, если я делаю следующее

def insert_data(self,SqlQry,parm):
        try:
            idvar=self.__cursor.var(cx_Oracle.NUMBER)
            SqlQry=SqlQry + " returning ID into :vrecord_id"

            self.__cursor.execute(SqlQry,parm, vrecord_id=idvar)
            vid= idvar.getvalue()
            self.__con.commit()
            retuen vid    

        except cx_Oracle.DatabaseError as e:
            return e
            print("Error in data insert")  


print(sql_insertData(
        """INSERT INTO RAP_RISK_TYPE(RISK_HEADER,RISK_TYPE_DISP,RISK_TYPE_DESC,RISK_TYPE_CAT) 
           VALUES
           (:v1, :v2, :v3,:v4)""", ['newvalue1','newvalue2','newvalue3','newvalue4']

Я не могу передать список из оператора печати и добавьте «idvar» одновременно.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Крис дал отличный общий ответ c. Если вы ищете конкретный c ответ на ваш вопрос, вам нужно сделать следующее:

self.__cursor.execute(SqlQry, parm + [idvar])

Другими словами, вам нужно убедиться, что передан только один набор параметров, а не несколько !

0 голосов
/ 02 февраля 2020

С помощью cx_ Oracle 7.3 вы можете получить доступ к Cursor.lastRowid после выполнения INSERT. См. Пример cx_ Oracle LastRowid.py:

cursor = connection.cursor()
cursor.execute("insert into mytab (id, data) values (:1, :2)", [1, "First"])
print("Rowid 1:", cursor.lastrowid)

В противном случае используйте условие RETURNING INTO, которое вы просматривали. В RETURNING INTO есть пример https://cx-oracle.readthedocs.io/en/latest/user_guide/bind.html#dml -turning-bind-variable .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...