ECPG使用数组参数调用存储过程

时间:2011-09-02 18:12:06

标签: postgresql embedded-sql ecpg

我有一个ECPG客户端试图获取数据。它使用带有subselect子句的预准备语句,使用存储的函数“getsipid”,它接受4个参数。 我已将此工作与声明为简单varchar的第4个参数一起使用。我试图将第四个参数声明为一个数组但是,ecpg只传递第四个arg中数组的第一个参数而不是所有这些参数。

传递完整的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

1 个答案:

答案 0 :(得分:0)

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

这样的东西

这在很多环境中都很常见,不仅仅是ecpg。

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