【发布时间】:2021-08-01 10:33:19
【问题描述】:
我尝试使用 python Cx_Oracle 在 oracle 中创建一些 DML 案例。 这些是案例:
#####DML TEST CASE###########
case1 = """
INSERT INTO Table(code, detailcode, VALUE1, VALUE2)
values('1111','1','2','3')
"""
case2 = """
BEGIN
INSERT INTO Table(code, detailcode, VALUE1, VALUE2)
values('1111','1','2','3');
INSERT INTO Table(code, detailcode, VALUE1, VALUE2)
values('2222','1','2','3');
INSERT INTO Table(code, detailcode, VALUE1, VALUE2)
values('3333','1','2','3');
COMMIT;
END;
"""
case3 = """
UPDATE Table SET value1='9999' WHERE code='1111'
"""
case4 = """
UPDATE Table SET value1='6666' WHERE code='2222'
"""
case5 = """
DELETE FROM Table WHERE code='3333'
"""
case0 = """
DELETE FROM Table
"""
连接成功后,我也做了一个代码来运行DML。
def DML(sql):
dsn = ora.makedsn('*',*,'*')
db = ora.connect('*','*',dsn)
db.begin()
cursor=db.cursor()
cursor.execute(sql)
db.commit()
cursor.close()
db.close()
在此代码中,存在一个问题,即在 case 3 和 case 4 中,commit() 可能不会被发送。 有没有办法发送sql行并显式发送提交,或者手动控制python Cx_Oracle中的事务?(我不应该使用自动提交)
【问题讨论】:
-
为什么不发送?如果出现问题,那么您不希望提交事务。
-
我知道您的简单示例可能与您实际执行的语句不同,但是使用给定的名称,您应该在单个
executemany()调用中传递案例 1 和案例 2 中的数据。案例 3 和案例 4 也应该合并为一个executemany()调用。除非您正在执行两阶段提交,否则您可以删除 begin() 和 close() 调用。