sql >> データベース >  >> RDS >> PostgreSQL

JavaでPostgreSQLからsetofrefcursorを返すプロシージャにアクセスするにはどうすればよいですか?

    returns setof refcursor 通常のResultSetを取得することを意味します ここで、各「行」には別の getObject()を呼び出すときのResultSet :

    以下は私のために働きます:

    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 2番目のカーソル用)

    編集

    これが機能するためには、これをトランザクション内で実行する必要があります。そのため、自動コミットをオフにする必要があります:

    connection.setAutoCommit(false);
    


    1. チェック制約内のSQLサブクエリ

    2. JDBCOracle-クエリのExplainPlanを取得します

    3. NoSQLデータベースでのデータの柔軟性の制約

    4. MySQLテーブル行の時刻と日付のスタンプ