PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak uzyskać dostęp do procedury zwracającej setof refcursor z PostgreSQL w Javie?

returns setof refcursor oznacza, że ​​otrzymujesz zwykły ResultSet gdzie każdy „wiersz” zawiera inny ResultSet podczas wywoływania getObject() :

U mnie działa:

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())
    {
       ......
    }
  }
}

Z poziomu psql możesz również użyć select * from usp_sel_article_initialdata_new1() wystarczy użyć FETCH ALL następnie. Zobacz przykładową instrukcję: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=>

(Stworzyłem fikcyjną funkcję dla powyższego przykładu, która zwraca tylko jeden wiersz o wartości 1 dla pierwszego kursora i 2 dla drugiego kursora)

Edytuj :

Aby to zadziałało, należy to uruchomić wewnątrz transakcji. Dlatego automatyczne zatwierdzanie musi być wyłączone:

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. Zmienna zawierająca liczbę wierszy, których dotyczyło poprzednie polecenie DELETE? (w funkcji)

  2. Unikaj wstawiania wartości „null” do tabeli bazy danych za pomocą JPA

  3. PostgreSQL:Auto-inkrementacja w oparciu o wielokolumnowe unikatowe ograniczenie

  4. EF6 + Postgres relacja dbo.AspNetUsers nie istnieje

  5. Ustaw domyślną wartość zwracaną dla funkcji Postgres