You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:43:27