我正在尝试使用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']
但是,如果我这样做,我该如何编写execute语句以获取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”。
使用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子句。https://cx-oracle.readthedocs.io/en/latest/user_guide/bind.html#dml-returning-bind-variables上有一个RETURNING INTO示例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句