如何在Oracle存储过程中使用Python变量作为动态变量
使用cx_Oracle调用Oracle存储过程并传递动态参数
核心实现代码
以下是完整的代码示例,包含数据库连接、参数传递及事务处理:
import cx_Oracle # 定义需要传入的Python变量 V_efr = "r55" NM = "dree" RS = "ssyt" # 替换为你的数据库连接信息 DB_USER = "your_username" DB_PWD = "your_password" DB_DSN = "your_host:your_port/your_service_name" try: # 建立数据库连接 conn = cx_Oracle.connect(DB_USER, DB_PWD, DB_DSN) cursor = conn.cursor() # 调用存储过程:按参数顺序传递 cursor.callproc("SQURT_EN_UR", [V_efr, NM, RS]) # 若存储过程包含输出参数,可按如下方式处理(示例) # output_var = cursor.var(cx_Oracle.STRING) # cursor.callproc("SQURT_EN_UR", [V_efr, NM, RS, output_var]) # print("输出参数结果:", output_var.getvalue()) # 提交事务(更新/插入操作必须提交才会生效) conn.commit() print("存储过程执行完成") except cx_Oracle.Error as e: print(f"执行出错: {e}") # 出错时回滚事务 if conn: conn.rollback() finally: # 关闭资源 if cursor: cursor.close() if conn: conn.close()
关键说明
cursor.callproc()是cx_Oracle调用存储过程的核心方法,第一个参数为存储过程名称,第二个参数是参数列表,顺序必须与存储过程定义的参数顺序完全匹配。- 如果存储过程包含输出参数,需先用
cursor.var()定义对应类型的变量,传入参数列表后,通过getvalue()获取输出值。 - 针对更新/插入类操作,必须调用
conn.commit()提交事务,否则数据库不会持久化修改;异常场景下要执行rollback()回滚,避免脏数据。
可选:使用命名参数传递
若想避免参数顺序错误,可通过命名参数方式传递(需匹配存储过程的参数名):
cursor.callproc("SQURT_EN_UR", keywordParameters={ "V_EFR": V_efr, "NM": NM, "RS": RS })
注意事项
- 确保Python变量的类型与存储过程参数类型兼容(如Oracle的
VARCHAR2对应Python字符串,NUMBER对应int/float)。 - 提前确认数据库客户端已正确配置,cx_Oracle版本与Oracle服务器版本兼容。
内容的提问来源于stack exchange,提问作者mick
相关产品推荐
相关产品推荐

