使用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
相关产品推荐
相关产品推荐

