DB2新手求助:使用ibm_db执行带参数查询后如何获取结果集
用Python的ibm_db获取DB2查询结果的完整示例
嘿,刚上手DB2和ibm_db包确实容易卡在结果获取这一步,我给你整理了完整的示例代码,连带着不同的结果获取方式一起说明,你可以直接照着改:
首先,你需要确保已经建立了数据库连接,然后在执行查询后,主要通过ibm_db.fetch_assoc()、ibm_db.fetch_tuple()这类方法来获取结果。下面是完整的流程:
import ibm_db # 替换成你的DB2连接信息 db_connection_params = "DATABASE=your_db_name;HOSTNAME=your_host;PORT=your_port;PROTOCOL=TCPIP;UID=your_username;PWD=your_password;" conn = ibm_db.connect(db_connection_params, "", "") if conn: try: # 1. 准备带参数的SELECT语句(用?作为占位符) select_sql = "SELECT employee_id, first_name, last_name, salary FROM employees WHERE department_id = ?" stmt = ibm_db.prepare(conn, select_sql) # 2. 绑定参数(这里假设要查询部门ID为10的员工) target_dept_id = 10 ibm_db.bind_param(stmt, 1, target_dept_id) # 3. 执行查询 execute_success = ibm_db.execute(stmt) if not execute_success: print(f"查询执行失败: {ibm_db.stmt_errormsg(stmt)}") exit() # --- 方式1:逐行获取字典格式的结果(键为列名,DB2默认返回大写)--- print("=== 字典格式结果 ===") row = ibm_db.fetch_assoc(stmt) while row: print(f"员工ID: {row['EMPLOYEE_ID']}, 姓名: {row['FIRST_NAME']} {row['LAST_NAME']}, 薪资: {row['SALARY']}") row = ibm_db.fetch_assoc(stmt) # 如果需要重新读取结果,先释放当前结果集再重新执行 ibm_db.free_result(stmt) ibm_db.execute(stmt) # --- 方式2:逐行获取元组格式的结果(按查询列的顺序取值)--- print("\n=== 元组格式结果 ===") row = ibm_db.fetch_tuple(stmt) while row: print(f"员工ID: {row[0]}, 姓名: {row[1]} {row[2]}, 薪资: {row[3]}") row = ibm_db.fetch_tuple(stmt) # --- 方式3:一次性获取所有结果(适合数据量较小的场景)--- ibm_db.free_result(stmt) ibm_db.execute(stmt) all_employees = [] row = ibm_db.fetch_assoc(stmt) while row: all_employees.append(row) row = ibm_db.fetch_assoc(stmt) print("\n=== 一次性获取所有结果 ===") for emp in all_employees: print(emp) except Exception as e: print(f"处理过程出错: {str(e)}") if 'stmt' in locals(): print(f"语句错误信息: {ibm_db.stmt_errormsg(stmt)}") finally: # 记得关闭语句和连接,释放资源 if 'stmt' in locals(): ibm_db.close(stmt) ibm_db.close(conn) else: print(f"数据库连接失败: {ibm_db.conn_errormsg()}")
关键说明:
ibm_db.fetch_assoc(stmt):返回当前行的字典,键是查询的列名(注意DB2默认会把列名转为大写),没有更多行时返回False。ibm_db.fetch_tuple(stmt):返回当前行的元组,元素顺序和SELECT语句中的列顺序一致,适合不需要列名的场景。ibm_db.free_result(stmt):释放当前结果集,让你可以重新执行语句获取新的结果。- 一定要记得关闭语句和连接,避免资源泄漏;同时加上异常处理,方便排查问题。
内容的提问来源于stack exchange,提问作者newjersey2017
相关产品推荐
相关产品推荐

