2011-01-28 11 views
1

select文を返すストアドプロシージャを作成する必要があります。たとえば、約4〜5列の値を返します。Informixストアドプロシージャの戻り値

Javaアプリケーションから呼び出す必要があるので、別のセッションからその一時テーブルにアクセスできないように、出力を一時テーブルに入れることはできません。ですから、私は基本的にストアドプロシージャを呼び出して、戻り値から配列リストを作成する必要があります。

返されるデータはselect * from tableになります。

答えて

0

ストアドプロシージャを、値を返すSELECTステートメントのように扱います。

ESQL/Cなどの言語では、「EXECUTE PROCEDURE」文を準備し、その文にカーソルを宣言し、OPEN、ループでFETCH、CLOSEを宣言します。類似の操作は、JDBCとJavaでも機能するはずです。準備と実行のフェーズを分ける必要がない可能性があります。


私は「Java」を綴ることができます。それは 'C'で始まる...そうじゃない? 'C'のように?

はESQL/Cで、(エラーチェックと変数宣言を無視して)記述します

EXEC SQL PREPARE prep_stmt FROM "EXECUTE PROCEDURE CursoryProcedure(?,?,?)"; 
EXEC SQL DECLARE cursor_nm FROM prep_stmt; 
EXEC SQL OPEN cursor_nm USING :hostvar1, :hostvar2, :hostvar3; 
while (SQLCODE == 0) 
{ 
    EXEC SQL FETCH cursor_nm INTO :receiver1, :receiver2, :receiver3, 
            :receiver4, :receiver5, :receiver6; 
    if (SQLCODE != 0) 
     break; 
    ...use the values in the receiverN variables... 
} 
EXEC SQL CLOSE cursor_nm; 
EXEC SQL FREE cursor_nm; 
EXEC SQL FREE prep_stmt; 

疑問符ストアドプロシージャに渡された入力値を表す3つのプレースホルダ。値はOPEN操作で値に渡されます。ストアドプロシージャは、1つまたは複数のデータ行を(ゼロまたは)戻すことがあります。各行は示されているように順番に処理されます。あなたはJDBCに上記ESQL/Cを変換する方法を動作するように持ってしようとしている - 今

select_str = "SELECT * FROM A_Table WHERE Col1 = ? AND (Col2 = ? OR Col3 < ?)"; 
EXEC SQL PREPARE prep_stmt FROM :select_str; 

そのコードとSELECT文を扱う唯一の違いは、PREPAREラインです。 ESQL/Cでは、おそらくその2つのうちの1つが重複しているかもしれませんが、無害です。しかし、PREPARE、DECLARE、OPEN、FETCH-IN-A-LOOPおよびCLOSEシーケンスを複製する必要があります。


私はあなたがマニュアルを読み、Informixのストアドプロシージャの作成方法を知ることができると仮定していますが、念のために:

CREATE PROCEDURE CursoryProcedure(i INTEGER, j CHAR(10), k DATE) 
    RETURNING CHAR(20) AS v1, INTEGER AS v2, DATE AS v3, 
       VARCHAR(255) AS v4, INTEGER AS v5, INTEGER AS v6; 
    DEFINE v1 CHAR(20); 
    DEFINE v2 INTEGER; 
    DEFINE v3 DATE; 
    DEFINE v4 VARCHAR(255); 
    DEFINE v5 INTEGER; 
    DEFINE v6 INTEGER; 
    FOREACH SELECT * 
       INTO v1, v2, v3, v4, v5, v6 
       FROM Table 
      WHERE Col1 = i AND (Col2 = j OR Col3 < k) 
     RETURN v1, v2, v3, v4, v5, v6 WITH RESUME; 
    END FOREACH; 
END PROCEDURE; 

これは仕事をして、多かれ少なかれ、最小限の手順です - データを使って何かを行わずに選択した値を単に返すプロシージャを書くことはしばしばありません。

+0

私は私の格納されたprodを書くとき私はselect文を宣言しますが、私は出力をtempテーブルに入れるinformix要求をします。私はちょうどクエリを実行しているかのように出力を取得したいと思います。 – glenn

関連する問題