[英]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中獲得此過程的結果?
我試過這個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()行第25in 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.num
是integer
類型嗎? 這就是我從這個例子中收集的內容。 在你的另一個問題上,我假設numeric
缺乏信息。 至少其中一個會失敗。
如果函數的返回類型與返回的值不匹配,則會從PostgreSQL函數中獲得錯誤。 正確配置后,PostgreSQL日志在這種情況下會有詳細的錯誤消息。
當你在PostgreSQL中創建上述函數然后調用時,你看到了什么:
SELECT get_geom_difference(1);
來自psql 。 (最好在同一會話中排除數據庫,端口,服務器或用戶的混合。)
調用一個簡單的函數獲取一個參數並返回一個標量值似乎非常簡單。 PostgreSQL JDBC手冊的第6.1章有一個完整的例子,它似乎與你在問題中的內容完全一致(盡管我的專長是Postgres而不是JDBC)。
工作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.