PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да получите достъп до процедурата, която връща setof refcursor от PostgreSQL в Java?

returns setof refcursor означава, че получавате обикновен ResultSet където всеки "ред" съдържа друг ResultSet при извикване на getObject() :

Следното работи за мен:

ResultSet rs = stmt.executeQuery("select * from usp_sel_article_initialdata_new1()");
if (rs.next())
{
  // first result set returned
  Object o = rs.getObject(1);
  if (o instanceof ResultSet)
  {
    ResultSet rs1 = (ResultSet)o;
    while (rs1.next())
    {
       int id = rs1.getInt(1);
       String name = rs1.getString(2);
       .... retrieve the other columns using the approriate getXXX() calls
    }
  }
}

if (rs.next()) 
{
  // process second ResultSet 
  Object o = rs.getObject(1);
  if (o instanceof ResultSet)
  {
    ResultSet rs2 = (ResultSet)o;
    while (rs2.next())
    {
       ......
    }
  }
}

От psql можете също да използвате select * from usp_sel_article_initialdata_new1() просто трябва да използвате FETCH ALL след това. Вижте ръководството за пример:http://www. postgresql.org/docs/current/static/plpgsql-cursors.html#AEN59018

postgres=> select * from usp_sel_article_initialdata_new1();
 usp_sel_article_initialdata_new1
----------------------------------
 <unnamed portal 1>
 <unnamed portal 2>
(2 rows)

postgres=> fetch all from "<unnamed portal 1>";
 ?column?
----------
        1
(1 row)

postgres=> fetch all from "<unnamed portal 2>";
 ?column?
----------
        2
(1 row)

postgres=>

(Създадох фиктивна функция за горния пример, която връща само един ред със стойност 1 за първия курсор и 2 за втория курсор)

Редактиране :

За да работи това, това трябва да се изпълни в транзакция. Следователно автоматичното поемане трябва да бъде изключено:

connection.setAutoCommit(false);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Проверка дали postgresql таблица съществува под python (и вероятно Psycopg2)

  2. pg_dump с --exclude-table все още включва тези таблици във фоновите команди COPY, които изпълнява?

  3. org.postgresql.util.PSQLException:ГРЕШКА:не можа да сериализира достъпа поради зависимости за четене/запис между транзакциите

  4. Индексиране на база данни в PostgreSQL

  5. Как да използвате ST_Intersects в WHERE клауза