ECPG-вызов хранимой процедуры с аргументом массива - PullRequest
1 голос
/ 02 сентября 2011

У меня есть клиент ECPG, пытающийся получить данные.Он использует подготовленный оператор с предложением subselect, используя хранимую функцию getsipid, которая принимает 4 аргумента.У меня была эта работа с 4-м аргументом, объявленным как простой varchar.Я пытался объявить 4-й аргумент как массив, однако, ecpg передает только первый аргумент массива в 4-м аргументе, а не все из них.

Какова хитрость, чтобы пройти весь набор 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 голосов
/ 22 марта 2013

Проблема обычно в том, что вам нужно обработать массив, чтобы он находился в строковом представлении PostgreSQL. Обычно это означает преобразование его в CSV и заключение его в соответствующие скобки. Таким образом, вы получите что-то вроде '{"myuser2","myuser1","myuser321"}'

Это довольно типично для многих сред, не только для ecpg.

Второй подход может заключаться в том, чтобы сделать функцию переменной и просто передать аргументы таким образом. Затем они появятся как массив, и вы сможете использовать их как таковые, но вы передадите их как отдельные аргументы.

...