我试图从ECPG接口调用postgres存储函数,该接口将char数组作为输入传递。 当我尝试打开光标时,我现在得到“太少的参数”。 相关摘录:
ECPG file:
EXEC SQL BEGIN DECLARE SECTION;
const char* cid = connid;
const char* stmt = NULL;
char tgrpkey[64]; // group key
char ccakey[64]; // call control agent key
char dhostkey[64]; // dest host key
char regusrkey[64]; // Registration user
EXEC SQL END DECLARE SECTION;
stmt = SELECT * FROM sipbasicquery(:ccakey::char[],:tgrpkey::char,:dhostkey::char[],:regusrkey::char[])";
EXEC SQL AT :cid PREPARE pstmt FROM :stmt;
EXEC SQL AT :cid DECLARE cur CURSOR FOR pstmt;
EXEC SQL AT :cid OPEN cur;
EXEC SQL AT :cid FETCH NEXT FROM cur INTO DESCRIPTOR sqlda;
存储的功能存在于我的服务器上,并具有以下签名。
CREATE OR REPLACE FUNCTION sipbasicquery(cca character[], tgrp character[],
dhost character[], usr character[])
RETURNS SETOF sipbasinfo AS $$
有人为什么会产生太少的参数错误?
启用ECPG调试后,失败如下:
[23064]: prepare_common on line 110: name pstmt; query: "SELECT * FROM sipbasicquery($1::char[],$2::char[],$3::char[],$4::char[])"
[23064]: raising sqlcode -202 on line 117: too few arguments on line 117
参数似乎与我的存储过程相匹配。为什么太少? 谢谢
戴夫
答案 0 :(得分:1)
您不能在查询中使用主机变量(:ccakey
等),该查询本身存储在主机变量(:stmt
)中。主机变量由ECPG解析器解析,但如果您的查询位于C字符串变量内,则无法使用。现在发生的事情是查询被发送到服务器不变,包括:ccakey::char[]
等,这将以随机的方式混淆后端的解析器。
您想要使用的是
stmt = "SELECT * FROM sipbasicquery(?::char[], ?::char, ?::char[], ?::char[])";
(演员表可能不是必需的.YMMV。)