2011-09-02 2 views
1

데이터를 얻으려고하는 ECPG 클라이언트가 있습니다. 그것은 4 개의 인수를 취하는 저장 함수 "getsipid"를 사용하여 subselect 절이있는 prepared statement를 사용합니다. 나는 이것을 간단한 varchar로 선언 된 네 번째 인수와 함께 작업하게했습니다. 그러나 4 번째 인수를 배열로 선언하려고 시도했지만 ecpg는 배열의 첫 번째 인수를 4 번째 인수에 전달하는 것이지 모든 인수를 전달하는 것은 아닙니다.배열 인수가있는 저장 프로 시저의 ECPG 호출

requsr (s)의 전체 arry를 전달하는 트릭은 무엇입니까? 이 배열 크기는 일반적으로 최대 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; 

저장된 기능이 문제는 일반적으로는 PostgreSQL의 문자열 표현에있을 배열을 처리 할 필요가있다

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

(psst ... 여기서 사용한 것과 동일한 자격 증명을 사용하여 DBA에 등록 할 수 있습니까? 그런 식으로 DBA는 내가 마이그레이션 한 게시물을 소유 한 사용자로 인식합니다.) – Will

답변

0

로 선언된다. 일반적으로 이것은 이것을 CSV로 변환하고 적절한 대괄호로 둘러 쌀 것을 의미합니다. 그래서 당신은 뭔가를 얻을 '{"myuser2","myuser1","myuser321"}'

이것은 실제로 ecpg뿐만 아니라 많은 환경에서 꽤 일반적입니다.

두 번째 방법은 함수를 가변적으로 만들고 args를 그런 식으로 전달하는 것입니다. 그런 다음 그들은 배열로 올 것이고 당신은 그것들을 그런 식으로 사용하게 될 것입니다, 그러나 당신은 그것들을 개별 인수로 전달합니다.