1

我有一个 ECPG 客户端试图获取数据。它使用带有子选择子句的准备好的语句,该子句使用带有 4 个参数的存储函数“getsipid”。我已经将第 4 个参数声明为简单的 varchar。我试图将第四个参数声明为一个数组,但是,ecpg 仅在第四个参数中传递数组的第一个参数,而不是全部。

传递整个 requsr(s) 数组的诀窍是什么。这个数组大小通常最多只能包含 5 个参数。我意识到我可以向函数添加更多参数来克服这个问题。我希望解决方案会更优雅。

感谢您的意见

戴夫

EXEC SQL BEGIN DECLARE SECTION;
const char* cid = connid;
const char* tgrp;      // group key ( trk )
const char* cca;       // call control agent key ( trk )
const char* dhost;     // dest host key (trk)
const char* regusr[MAX_USRS];   // Registration user (lin)
EXEC SQL END DECLARE SECTION;

pgc 文件准备了上面的主机变量,并且有一个调用效果。

EXEC SQL AT :cid PREPARE ps_portdataviasip FROM
       "SELECT * FROM port LEFT JOIN linesip USING (id)\
                           LEFT JOIN trunksip USING (id)\
                           LEFT JOIN customer USING (cid)\
                       WHERE port.id =  (SELECT getsipid(?, ?, ?, ?))\
                       ORDER BY registersip.expiration DESC"; 
EXEC SQL AT :cid DECLARE cur_portsip CURSOR FOR ps_portdataviasip;
EXEC SQL AT :cid OPEN cur_portsip USING :cca, :tgrp, :dhost, :regusr;
EXEC SQL AT :cid FETCH NEXT FROM cur_portsip INTO DESCRIPTOR sqlda;

存储的函数声明为

CREATE OR REPLACE FUNCTION getsipid(cca character varying, tgrp character varying, 
    dhost character varying, usr character varying[]) RETURNS INTEGER AS
4

1 回答 1

0

问题通常是您需要将数组处理为 PostgreSQL 字符串表示形式。通常这意味着将其转换为 CSV 并用适当的括号括起来。所以你会得到类似的东西'{"myuser2","myuser1","myuser321"}'

这实际上在很多环境中都很典型,不仅是 ecpg。

第二种方法可能是使函数可变参数并以这种方式传递参数。然后它们将作为一个数组进来,你可以这样使用它们,但是你将它们作为单独的参数传递。

于 2013-03-22T02:20:00.803 回答