1

ECPGクライアントがデータを取得しようとしています。これは、4つの引数を取るストアド関数 "getsipid"を使用して、subselect句でプリペアドステートメントを使用します。私はこれを単純なvarcharとして宣言された4番目の引数で動作させました。4番目の引数を配列として宣言しようとしましたが、ecpgは4番目の引数で配列の最初の引数のみを渡し、すべてではありません。

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;

ストアド関数は次のように宣言されます

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

1 に答える 1

0

通常、問題は、PostgreSQL 文字列表現になるように配列を処理する必要があることです。通常、これは CSV に変換し、適切なブラケットで囲むことを意味します。だからあなたは次のようなものを得る'{"myuser2","myuser1","myuser321"}'

これは実際、ecpg だけでなく、多くの環境でかなり一般的です。

2 番目のアプローチは、関数を可変個引数にして、その方法で引数を渡すことです。次に、それらは配列として入り、それらをそのまま使用できますが、それらを個別の引数として渡します。

于 2013-03-22T02:20:00.803 に答える