CX_Oracle 使用绑定变量/函数和 return 记录 ID 插入数据
CX_Oracle insert data using Bind variable / function and return the record id too
我正在尝试使用 cx_oracle 创建定义以将数据插入数据库并在 return 中获取记录 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"。
使用 cx_Oracle 7.3,您可以访问 Cursor.lastRowid
after executing the INSERT. See the cx_Oracle example 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 示例
克里斯给出了一个很好的通用答案。如果您正在寻找问题的具体答案,您需要执行以下操作:
self.__cursor.execute(SqlQry, parm + [idvar])
也就是说,你需要保证只传递一组参数,而不是多个!
我正在尝试使用 cx_oracle 创建定义以将数据插入数据库并在 return 中获取记录 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"。
使用 cx_Oracle 7.3,您可以访问 Cursor.lastRowid
after executing the INSERT. See the cx_Oracle example 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 示例克里斯给出了一个很好的通用答案。如果您正在寻找问题的具体答案,您需要执行以下操作:
self.__cursor.execute(SqlQry, parm + [idvar])
也就是说,你需要保证只传递一组参数,而不是多个!