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

Я пытаюсь вызвать хранимую функцию postgres из интерфейса ECPG, который передает массивы символов в качестве входных данных.В настоящее время я получаю «слишком мало аргументов», когда пытаюсь открыть курсор.Соответствующие выдержки:

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 ошибка выглядит следующим образом:

[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

Кажется, что аргументы соответствуют моей хранимой процедуре.Почему слишком мало?Спасибо

Дейв

1 Ответ

1 голос
/ 11 августа 2011

Нельзя использовать переменные хоста (:ccakey и т. Д.) В запросе, который сам хранится в переменной хоста (:stmt). Переменные хоста разрешаются анализатором ECPG, но это не сработает, если ваш запрос находится внутри строковой переменной C. Сейчас происходит то, что запрос отправляется на сервер без изменений, включая :ccakey::char[] и т. Д., И это может привести к случайному путанию парсера бэкэнда.

Вместо этого вы хотите использовать

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

(Приведения могут быть не нужны. YMMV.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...