【问题标题】:oracle update sql using pythonoracle使用python更新sql
【发布时间】: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() 调用。

标签: python sql oracle


【解决方案1】:

cx_Oracle 游标可以及时处理一个 SQL 操作。 因此,将“COMMIT”添加到 SQL 中的唯一方法是将其包装在 PL/SQL 块中,就像您在 case2 中所做的那样。

例如,案例 3 的整体提交:

case3 = """BEGIN

UPDATE Table SET value1='9999' WHERE code='1111' ;

COMMIT;

END;
"""

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多