2011-08-09 20 views
1

char配列を入力として渡すECPGインターフェイスから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 $$ 

引数エラーが少なすぎる理由はありますか?

[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 

引数は、私のストアドプロシージャと一致するように見える:ECPGデバッグで

は、障害がどのように見える有効。なぜあまりにも少ない? ありがとうございますが、それ自体がホスト変数(:stmt)に格納されたクエリでホスト変数(:ccakeyなど)を使用することはできません

デイブ

答えて

1

。ホスト変数はECPGパーサによって解決されますが、クエリがC文字列変数の内部にある場合は動作しません。何が起きているのかは、クエリが:ccakey::char[]などの変更されていないサーバーに送信され、バックエンドのパーサーをランダムな方法で混乱させるということです。あなたが代わりに使用することは

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

ある

(キャストが必要ではないかもしれません。メーリングリストへ。)

+0

私の問題の一部だったおかげで、ピーターは、。別の問題は、カーソルが実際に開かれたときに、 "USING"節を使用してHOST変数を参照しなければならないことでした。これは進歩ですが、今はエラーが残っています。 "配列は" {"または次元で始まる必要があります。 – Dave

関連する問題