首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ECPG调用预准备语句中带有数组参数的存储过程

ECPG调用预准备语句中带有数组参数的存储过程
EN

Stack Overflow用户
提问于 2011-08-09 18:42:55
回答 1查看 674关注 0票数 1

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

代码语言:javascript
复制
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;

存储的函数存在于我的服务器上,并具有以下签名。

代码语言:javascript
复制
    CREATE OR REPLACE FUNCTION sipbasicquery(cca character[], tgrp character[],
                                             dhost character[], usr character[])
                      RETURNS SETOF sipbasinfo AS $$

为什么会产生太少的参数错误呢?

启用ECPG调试后,故障如下所示:

代码语言:javascript
复制
[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

参数似乎与我的存储过程相匹配。为什么太少了?谢谢

戴夫

EN

回答 1

Stack Overflow用户

发布于 2011-08-11 06:54:20

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

你想用的是

代码语言:javascript
复制
stmt = "SELECT * FROM  sipbasicquery(?::char[], ?::char, ?::char[], ?::char[])";

(铸造可能没有必要。( YMMV.)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7001234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档