如何从Jitterbit调用PostgreSQL存储过程?求示例代码及报错解决
从Jitterbit调用PostgreSQL存储过程的正确方式及报错排查
报错原因分析
你遇到的function SPNAME(...) does not exist错误,核心原因是调用时传递的参数类型、数量/顺序与存储过程定义不匹配,或者存储过程名称的大小写处理不符合PostgreSQL规则。
排查与解决步骤
1. 确认PostgreSQL存储过程的定义
首先核对存储过程的参数名称、类型、数量和顺序,确保和调用一致。例如,假设你的存储过程定义如下:
CREATE OR REPLACE PROCEDURE "SPNAME"( p_imported_by1 VARCHAR, p_id1 INT, p_imported_by2 VARCHAR, p_id2 INT, OUT p_result REFCURSOR ) LANGUAGE plpgsql AS $$ BEGIN OPEN p_result FOR SELECT * FROM your_target_table WHERE imported_by IN (p_imported_by1, p_imported_by2) AND id IN (p_id1, p_id2); END; $$;
注意:
- 如果存储过程名称创建时用了双引号(如
"SPNAME"),调用时必须保持大小写一致并加双引号,否则PostgreSQL会自动转成小写查找,导致找不到函数。 - 确认输入参数的类型(如
VARCHAR/INT)和输出参数的REFCURSOR类型定义。
2. 修正Jitterbit调用代码
针对你的报错,需要调整参数类型转换和名称匹配,以下是修正后的示例代码:
// 定义存储过程名称(注意大小写和双引号,和创建时一致) var spName = "\"SPNAME\""; // 初始化结果集变量 var resultSet = []; // 显式转换参数类型,匹配存储过程定义 var param1 = "ImportedbySSM"; // 对应VARCHAR类型参数 var param2 = ToInteger('3784'); // 将字符串转成INT类型,匹配存储过程的INT参数 var param3 = "ImportedbySSM"; var param4 = ToInteger('2056'); // 定义游标名称,对应存储过程的OUT REFCURSOR参数 var refCursor = "swv_refcur"; // 调用存储过程 CallStoredProcedure("<TAG>Targets/Database/TestingPGSQL</TAG>", spName, resultSet, param1, param2, param3, param4, refCursor); // 处理返回的结果集 if (resultSet != null && resultSet.length > 0) { for each (row in resultSet) { // 示例:打印每行的某列值 // WriteToOperationLog(row.your_column_name); } }
3. 常见问题排查清单
- 参数类型不匹配:Jitterbit中字符串形式的数字必须用
ToInteger()转成整数类型,否则会以VARCHAR传递,与存储过程的INT参数不匹配。 - 大小写问题:PostgreSQL对标识符(表、存储过程名)的大小写敏感,未加双引号的名称会被转成小写。如果存储过程是用双引号创建的,调用时必须带双引号。
- 权限问题:确保Jitterbit连接PostgreSQL的用户拥有该存储过程的执行权限,可执行以下SQL授权:
GRANT EXECUTE ON PROCEDURE "SPNAME"(VARCHAR, INT, VARCHAR, INT, REFCURSOR) TO your_jitterbit_user; - 游标参数处理:存储过程必须定义
OUT类型的REFCURSOR参数,Jitterbit中传递的游标名称需唯一且有效,PG会通过该游标返回结果集。
内容的提问来源于stack exchange,提问作者ketan patel
相关产品推荐
相关产品推荐

