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

使用Python调用DB2(IBM i)存储过程遇SQL0440错误求助

Python调用IBM i DB2存储过程遇SQL0440错误的解决方法

问题详情

我希望用Python运行IBM i(DB2)的存储过程,已通过pyodbc成功建立连接,连接脚本如下:

import json
import pyodbc

with open("config.json","r") as f:
    CONFIG = json.load(f)

dsn = CONFIG["servername"]["dsn"]
schema= CONFIG["servername"]["schema"]
tbl= CONFIG["servername"]["tbl"]
sp = CONFIG["servername"]["sp"]
user = CONFIG["servername"]["user"]
pw = CONFIG["servername"]["pw"]

conn = pyodbc.connect(f"DSN={dsn};UID={user};PWD={pw}")
cursor = conn.cursor()

尝试运行存储过程时使用以下代码:

test_query = f"""CALL MYLIB.MYSP()"""
cursor.execute(test_query)

# 或者类似写法
# test_query = f"""CALL {schema}.{tbl}()"""
# cursor.execute(test_query)

触发错误:

Error: ('HY000', '[HY000] [IBM][iSeries Access ODBC Driver][DB2 UDB]SQL0440 - Routine MYSP in MYLIB not found with specified parameters. (-440) (SQLExecDirectW)')

注:该存储过程用于创建表,在DBeaver中执行CALL MYLIB.MYSP();可正常运行。

排查与修复步骤

  • 修正变量误用
    检查配置变量的使用:你定义了sp存储过程变量,但示例中用了tbl(表名变量)来拼接存储过程调用语句,这会导致调用错误的对象。正确写法应该是:

    test_query = f"CALL {schema}.{sp}()"
    cursor.execute(test_query)
    
  • 使用ODBC转义语法
    IBM i的ODBC驱动推荐使用ODBC标准的转义语法调用存储过程,避免语法兼容性问题:

    cursor.execute("{CALL MYLIB.MYSP()}")
    
  • 确认参数匹配与调用格式
    SQL0440错误核心是参数不匹配,即便存储过程无参数,部分驱动对括号的处理有差异:

    • 若存储过程无参数,尝试不带括号调用:
      cursor.execute("CALL MYLIB.MYSP")
      
    • 或者用参数化方式明确传递空参数:
      cursor.execute("CALL MYLIB.MYSP(?)", (None,))
      
  • 检查对象名大小写与权限
    IBM i上对象名默认大写,若存储过程是用带引号的小写创建,调用时必须加双引号:

    cursor.execute('CALL "MYLIB"."MYSP"()')
    

    同时确认连接用户拥有该存储过程的执行权限,以及库名拼写完全正确。

内容的提问来源于stack exchange,提问作者all_about_data

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 16:30:05