SSIS Execute SQL Task调用Redshift存储过程失败排查求助
问题分析与解决
1. 报错核心原因
是的,这就是触发Undefined procedure proc_test错误的直接原因。Redshift中**存储过程(PROCEDURE)和自定义函数(FUNCTION)**是完全独立的数据库对象,调用语法互不兼容:
- 存储过程必须用
CALL语句调用 - 函数必须用
SELECT语句调用
如果你的对象实际是函数,却用CALL执行,就会触发“找不到存储过程”的报错。
2. 为什么存储过程会显示在Functions标签下
这是数据库客户端工具的显示逻辑问题,而非Redshift本身的对象类型混淆:
- Redshift系统层面严格区分两类对象:通过
CREATE PROCEDURE创建的是存储过程,通过CREATE FUNCTION创建的是自定义函数 - 很多客户端(比如DBeaver、AWS Redshift查询编辑器)会把用户自定义函数和存储过程合并到同一个"Functions"分类下展示,方便用户统一查看,但这并不改变它们的本质类型。
3. 修正步骤
步骤1:确认对象的实际类型
执行以下SQL查询,明确proc_test的真实类型:
SELECT schemaname, objname, objtype FROM pg_catalog.pg_user_defined_objects WHERE objname = 'proc_test';
- 若
objtype返回PROCEDURE:对象是存储过程 - 若
objtype返回FUNCTION:对象是自定义函数
步骤2:根据对象类型调整调用语句
情况A:对象是存储过程
- 确保调用语法完整:Redshift存储过程的全称格式为
database.schema.procedure_name,务必指定正确的schema(默认是public)。比如存储过程在dev库的publicschema下,正确调用语句为:CALL dev.public.proc_test; - 同时检查OLEDB连接的默认数据库是否为
dev:如果默认库不是dev,必须带上数据库前缀;如果默认库是dev,可简化为CALL public.proc_test;甚至CALL proc_test;
情况B:对象是自定义函数
- 替换
CALL为SELECT语句调用,示例:
(注意函数即使无参数也需要加括号)SELECT dev.public.proc_test(); - 保持Execute SQL Task的
ResultSet设置为None即可,无需调整。
步骤3:验证权限配置
确保OLEDB连接的登录用户对目标对象(存储过程/函数)拥有EXECUTE权限,避免因权限不足导致的“找不到对象”假象。
内容的提问来源于stack exchange,提问作者Saranya
相关产品推荐
相关产品推荐

