3

Java でこのようなクエリを作成し、結果を取得する方法:

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

または、このクエリから Postgres でプロシージャを作成した方がよいと思います。

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'

そしてそれを呼び出します

Connection ce_proc= null;
ce_proc = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgis","postgres","123456");
java.sql.CallableStatement proc =  ce_proc.prepareCall("{get_geom_difference()}");
proc.execute();
proc.close();
ce_proc.close();

しかし、Java でこの手順から結果を取得するにはどうすればよいでしょうか。

アップデート

やってみたSP

DROP FUNCTION get_geom_difference();

CREATE OR REPLACE FUNCTION get_geom_difference()
RETURNS integer AS
$$
DECLARE

tt integer;
BEGIN
SELECT filedata.num INTO tt
FROM filedata
Where filedata.num=1;
RETURN tt;

END;
$$
LANGUAGE 'plpgsql'

そして電話する

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.executeQuery(); 
ResultSet results = (ResultSet) proc.getObject(1);

エラーが発生しました:

in lineorg.apache.jasper.JasperException: proc.executeQuery();行 25 で JSP ページ /commit_changes.jsp の処理中に例外が発生しました。

根本原因 javax.servlet.ServletException: org.postgresql.util.PSQLException: クエリによって結果が返されませんでした

しかし、クエリ

SELECT filedata.num 
FROM filedata
Where filedata.num=1;

戻ります1

どこが間違い?

4

5 に答える 5

2

かなりの数の異なるCallableStatementコンストラクターがありますが、結果を取り戻すことができるのはそのうちの2つだけです

AResultSetはによって返されCallableStatement.executeQuery()ます。上記のリンクに良い完全な例があります。

CallableStatementからスカラー結果を取得することが合法かどうかはわかりません。PgJDBCただし、1行の行セットに変換することを期待しているので、機能するはずです。

于 2012-08-08T12:16:31.107 に答える
2

関数を大幅に簡略化できます。(質問のために単純化された関数を保持します。)

CREATE OR REPLACE FUNCTION get_geom_difference()
   RETURNS integer AS
$BODY$
   SELECT num
   FROM   filedata
   WHERE  num = 1 
   LIMIT  1;  -- needed if there can be more than one rows with num = 1
$BODY$    LANGUAGE SQL;

ただし、技術的には、データ型が一致していれば、質問にあるものも機能します。しますか?filedata.numタイプの列integerですか?それが私が例から集めたものです。あなたの他の質問について、私はnumeric情報が不足していると思っていました。それらの少なくとも1つは失敗します。

関数の戻り型が戻り値と一致しない場合、PostgreSQL関数からエラーが発生します。この場合、適切に構成されていると、PostgreSQLログに詳細なエラーメッセージが表示されます。

上記の関数をPostgreSQLで作成してから呼び出すと、何が表示されますか。

SELECT get_geom_difference(1);

psqlから。(できれば、同じセッションで、データベース、ポート、サーバー、またはユーザーの混同を除外します。)

1つのパラメーターを取り、1つのスカラー値を返す単純な関数を呼び出すのは、非常に簡単なようです。PostgreSQL JDBCマニュアルの第6.1章には、あなたの質問に完全に一致しているように見える完全な例があります(ただし、私の専門知識はJDBCではなくPostgresにあります)。

于 2012-08-09T07:29:39.927 に答える
0

そのためにはJDBCが必要です。ここで、JDBC関連のすべての情報を見つけることができるはずです。

JavaアプリケーションをPostgreSQLに接続する方法の詳細なチュートリアルについては、こちらをご覧ください。

于 2012-08-08T07:35:50.053 に答える
0

クエリの例は典型的なものです。だからあなたが必要とするのは

Java Database Connectivity(JDBC)

そしてそれを提供するために必要なすべては、パッケージjava.sqlにあります

したがって、この時点で、チュートリアルを読んで、特定の問題がある場合はSOに書き込むことをお勧めします。

于 2012-08-08T07:33:25.467 に答える
0

100% Java 7 および postgres pgadmin 2016 で動作します。createNativeQuery を使用します。トランザクションでこれを記述し、myschema.mymethodThatReturnASelectを変更します。

スキームと関数の名前。

@Override
    public List<ViewFormulario> listarFormulario(Long idUsuario) {
        List<ViewFormulario> list =null;
        try {
            Query q = em.createNativeQuery("SELECT * FROM myschema.mymethodThatReturnASelect(?);");
            q.setParameter(1, idUsuario);

             List<Object[]> listObject = (List<Object[]>) q.getResultList();
            if (listObject != null && !listObject.isEmpty()) {
                list = new ArrayList<>();
                for (Object o[] : listObject) {
                    ViewFormulario c = new ViewFormulario();
                    c.setIdProyecto(o[0] != null ? Long.valueOf(o[0].toString()) : -1L);

...など...など。

于 2016-02-17T23:14:28.187 に答える