Postgresql ECPG调用预处理语句中带有数组参数的存储过程

Postgresql ECPG调用预处理语句中带有数组参数的存储过程,postgresql,Postgresql,我试图从ECPG接口调用postgres存储函数,该接口将字符数组作为输入传递。 当我试图打开光标时,我当前得到的参数“太少”。 相关摘录: ECPG file: EXEC SQL BEGIN DECLARE SECTION; const char* cid = connid; const char* stmt = NULL; char tgrpkey[64]; // group key char ccakey[64];

我试图从ECPG接口调用postgres存储函数,该接口将字符数组作为输入传递。 当我试图打开光标时,我当前得到的参数“太少”。 相关摘录:

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 debug后,故障如下所示:

[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
参数似乎与我的存储过程匹配。为什么太少了? 谢谢


Dave

不能在本身存储在主机变量(
:stmt
)中的查询中使用主机变量(
:ccakey
等)。主机变量由ECPG解析器解析,但如果您的查询位于C字符串变量内,则这将不起作用。现在发生的事情是,查询未经更改地发送到服务器,包括
:ccakey::char[]
等,这将以随机方式混淆后端的解析器

你想用的是

stmt = "SELECT * FROM  sipbasicquery(?::char[], ?::char, ?::char[], ?::char[])";

(强制转换可能不是必需的。YMMV。)

不能在本身存储在主机变量(
:stmt
)中的查询中使用主机变量(
:ccakey
等)。主机变量由ECPG解析器解析,但如果您的查询位于C字符串变量内,则这将不起作用。现在发生的事情是,查询未经更改地发送到服务器,包括
:ccakey::char[]
等,这将以随机方式混淆后端的解析器

你想用的是

stmt = "SELECT * FROM  sipbasicquery(?::char[], ?::char, ?::char[], ?::char[])";

(演员可能没有必要。YMMV。)

谢谢彼得,这是我的问题之一。另一个问题是,当光标实际打开时,它必须使用“USING”子句,该子句随后引用主机变量。这是一个进步,尽管我现在有一个错误。数组必须以“{”或维度开头。如果我今天不能理解,这可能是另一个主题线程。谢谢Peter,这是我问题的一部分。另一个问题是当光标实际打开时,它必须使用“USING”子句,该子句随后引用主机变量。这是一个进步,尽管我现在有一个错误数组必须以“{”或维度开头。如果我今天不能理解的话,这可能是另一个主题线程。