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

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库的public schema下,正确调用语句为:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 09:35:08