簡體   English   中英

如何用Java調用PostgreSQL程序?

[英]How to call PostgreSQL procedure in Java?

如何在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中獲得此過程的結果?

UPDATE

我試過這個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);

並得到一個錯誤:

org.apache.jasper.JasperException: in line proc.exe.executeQuery()行第25 in line處理JSP頁面/commit_changes.jsp時發生異常;

根本原因javax.servlet.ServletException:org.postgresql.util.PSQLException:查詢未返回任何結果

但查詢

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

返回1

哪里出錯?

有很多不同的CallableStatement構造函數,但只有兩個可以讓你得到結果

CallableStatement.executeQuery()返回ResultSet 上面的鏈接中有一個很好的完整示例。

我不知道從CallableStatement獲取標量結果是否合法。 我希望PgJDBC將它轉換為一行的行集,所以它應該可以工作。

您可以在很大程度上簡化功能。 (為了這個問題,保持簡單的功能。)

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.numinteger類型嗎? 這就是我從這個例子中收集的內容。 你的另一個問題上,我假設numeric缺乏信息。 至少其中一個會失敗。

如果函數的返回類型與返回的值不匹配,則會從PostgreSQL函數中獲得錯誤。 正確配置后,PostgreSQL日志在這種情況下會有詳細的錯誤消息。

當你在PostgreSQL中創建上述函數然后調用時,你看到了什么:

SELECT get_geom_difference(1);

來自psql (最好在同一會話中排除數據庫,端口,服務器或用戶的混合。)

調用一個簡單的函數獲取一個參數並返回一個標量值似乎非常簡單。 PostgreSQL JDBC手冊的第6.1章有一個完整的例子,它似乎與你在問題中的內容完全一致(盡管我的專長是Postgres而不是JDBC)。

您的查詢示例是典型的。 所以你需要的是

Java數據庫連接(JDBC)

以及服務它所需的一切,都在java.sql包中

所以在這一點上,我重新考慮你閱讀一些教程,如果你有一些特殊的問題在SO上寫下來。

你需要JDBC才能做到這一點。 您應該能夠在此處找到所有與JDBC相關的信息。

在這里查看有關如何將Java應用程序連接到PostgreSQL的更詳細的教程。

工作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);

...等...等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM