【问题标题】:CX_Oracle insert data using Bind variable / function and return the record id tooCX_Oracle 使用 Bind 变量/函数插入数据并返回记录 id
【发布时间】:2020-05-17 19:58:33
【问题描述】:

我正在尝试使用 cx_oracle 创建一个定义,以将数据插入到数据库中,然后获取记录 ID。我搜索了论坛并找到了如下解决方案。

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

这很好用,我可以获取 ID。但我想用 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']

但是如果我这样做,我该如何编写执行语句来获取 ID,如果我执行以下操作会出错

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”。

【问题讨论】:

    标签: python cx-oracle


    【解决方案1】:

    使用 cx_Oracle 7.3,您可以在执行 INSERT 后访问Cursor.lastRowid。参见 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 子句。 https://cx-oracle.readthedocs.io/en/latest/user_guide/bind.html#dml-returning-bind-variables 有一个 RETURNING INTO 示例。

    【讨论】:

    【解决方案2】:

    克里斯给出了一个很好的通用答案。如果您正在寻找问题的具体答案,您需要执行以下操作:

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

    也就是说,你需要确保只传递一组参数,而不是多个!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 2012-10-21
      相关资源
      最近更新 更多