1

私はPostgreSQLに手順を持っています:

CREATE OR REPLACE FUNCTION get_geom_difference()
RETURNS void AS
$$
BEGIN
SELECT filedata.num,st_area(ST_Difference(ST_TRANSFORM(filedata.the_geom,70066),filedata_temp.the_geom))
FROM filedata, filedata_temp
Where filedata.num=filedata_temp.num

end;
$$
LANGUAGE 'plpgsql'

私はそれを Java で呼び出し、この手順の結果を取得したいと考えています。この手順を変更して結果を得るにはどうすればよいですか? そして、JDBCでそれを扱う方法は?

今私はこれを使用します:

Integer fileId;
Class.forName("org.postgresql.Driver");
Connection connect= null;
connect = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgis","postgres","123456");
java.sql.CallableStatement proc =  connect.prepareCall("{?=call get_geom_difference()}");
proc.registerOutParameter(1, java.sql.Types.Integer);
proc.execute();
ResultSet results = (ResultSet) proc.getObject(1);
while (results.next()) {
fileId=r.getInt("num");
}
proc.close();
connect.close();
out.println(fileId);

しかし、JDBCでプロシージャを呼び出そうとすると、

エラー org.apache.jasper.JasperException: 行 25 で JSP ページ /commit_changes.jsp を処理中に例外が発生しました

25 行目は次のとおりです。proc.execute();

4

3 に答える 3

7

適切な関数定義

CREATE OR REPLACE FUNCTION get_geom_difference()
  RETURNS TABLE (num mumeric, my_area geometry) AS
$BODY$
   SELECT f.num
         ,st_area(ST_Difference(ST_TRANSFORM(f.the_geom, 70066), t.the_geom))
   FROM   filedata f
   JOIN   filedata_temp t USING (num);
$BODY$
LANGUAGE sql;

複合型 (2 列) の SET を返しているため、それに応じて関数を宣言する必要があります。RETURNS TABLEこれを行う最も便利な方法です。

OUT同じ名前の列と競合しないように、クエリ内の列名を必ずテーブル修飾してください。

language SQLこの基本的なクエリには関数を使用できます (または生の SQL を実行するだけでもかまいません)。plpgsql は必要ありません。

SQL で関数を呼び出す

SELECT * FROM get_geom_difference();

JDBC経由で行う

ここにマニュアルを引用します

データをセットとして返す関数は、CallableStatement インターフェース経由で呼び出すのではなく、通常の Statement または PreparedStatement インターフェースを使用する必要があります。

また、このサイトからこの例を取得し、それを適応させました。

Statement stmt = conn.createStatement();
stmt.execute(" <function definition from above goes here> ");
ResultSet rs = stmt.executeQuery("SELECT * FROM get_geom_difference();");
while (rs.next()) {
    // do something
}
rs.close();
stmt.close();

refcursor を使用することもできます。詳しくはマニュアルをご覧ください。

于 2012-08-08T14:48:37.653 に答える
1

あなたの定義では、あなたの関数は何も返しませんRETURNS void。num データ型が必要な場合は、に変更するだけRETURNS numericです。また、それを機能させるには、いくつかの数値変数に選択を実行し、関数の最後にSELECT INTO var追加します。return var

于 2012-08-08T10:58:39.563 に答える