2011-09-02 90 views
1

我有一個ECPG客戶端試圖獲取數據。它使用一個準備語句和一個使用存儲函數「getsipid」的子查詢子句,該函數接受4個參數。 我有這個工作與第四個參數聲明爲一個簡單的varchar。我曾嘗試將第四個參數聲明爲一個數組,但是,ecpg僅在第四個參數中傳遞數組的第一個參數,而不是全部。ECPG使用數組參數調用存儲過程

傳遞請求者的整個詭計是什麼。這個數組大小通常只包含多達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 
+0

(psst ...你可以用DBA註冊你在這裏使用的相同憑據嗎?這樣DBA就會認可你是擁有我遷移後的用戶,謝謝!) – Will

回答

0

這一問題通常是,你需要處理該陣列是在PostgreSQL的字符串表示。通常這意味着將其轉換爲CSV並用適當的括號括起來。所以你得到像'{"myuser2","myuser1","myuser321"}'

這實際上很多環境中非常典型,不僅ecpg。

第二種方法可能是製作函數variadic,並以這種方式傳遞參數。然後他們會以一個數組的形式進來,您可以像使用它們一樣使用它們,但是您將它們作爲單獨的參數傳遞。

相關問題