在 Python 中准备并执行包含变量输入的 SQL 语句

要准备并执行包含变量输入的 SQL 语句,请使用 ibm_db.prepareibm_db.bind_paramibm_db.execute 函数。 准备语句可以改善性能,因为数据库服务器会创建优化的访问方案来执行数据检索,该访问方案可以在该语句再次执行时复用。

准备工作

通过调用 ibm_db API 中的某个连接函数获取连接资源。 请参阅 在 Python中连接到 IBM 数据库服务器

过程

要准备并执行包含参数标记的 SQL 语句,请完成下列步骤:

  1. 调用 ibm_db.prepare 函数,传递列出的参数:
    连接
    ibm_db.connectibm_db.pconnect 函数返回的有效数据库连接资源。
    语句
    一个字符串,其中包含 SQL 语句,包括作为参数标记的问号 (?),代表需要变量输入的列或谓词值。 此字符串可以包含由 XMLQUERY 函数调用的 XQuery 表达式。
    选项
    可选:一个字典,用于指定要为结果集返回的游标类型。 您可使用此参数来请求可滚动游标,以用于支持此类游标的数据库服务器。 缺省情况下,将会返回仅正向游标。

    如果函数调用成功,那么它会返回语句句柄资源,供您用于后续与该查询相关的函数调用。

    如果函数调用失败 (返回False) ,可以使用 ibm_db.stmt_erroribm_db.stmt_errormsg 函数来检索有关错误的诊断信息。

  2. 可选: 对于 SQL 字符串中的每个参数标记,调用 ibm_db.bind_param 函数并传递列出的参数。 通过将输入值与参数标记绑定,可确保将每个输入值都视为单个参数,这可阻止 SQL 注入攻击。
    stmt
    ibm_db.prepare 函数调用所返回的预编译语句。
    参数-编号
    一个整数,用于表示参数标记在 SQL 语句中所处的位置。
    变量
    用于替换参数标记的值。
  3. 调用 ibm_db.execute 函数,传递列出的参数:
    stmt
    ibm_db.prepare 所返回的预编译语句。
    参数
    与预编译语句中包含的参数标记匹配的输入参数元组。

    有关 ibm_db API 的更多信息,请参阅 https://github.com/ibmdb/python-ibmdb/wiki/APIs

示例

准备并执行包含变量输入的语句。

import ibm_db
conn = ibm_db.connect("database","username","password")
sql = "SELECT EMPNO, LASTNAME FROM EMPLOYEE WHERE EMPNO > ? AND EMPNO < ?"
stmt = ibm_db.prepare(conn, sql)
max = 50
min = 0
# Explicitly bind parameters
ibm_db.bind_param(stmt, 1, min)
ibm_db.bind_param(stmt, 2, max)
ibm_db.execute(stmt)
# Process results

# Invoke prepared statement again using dynamically bound parameters
param = max, min, 
ibm_db.execute(stmt, param)

后续操作

如果该 SQL 语句返回一个或多个结果集,您可开始从语句资源访存行。