sql >> Databasteknik >  >> RDS >> Mysql

Det går inte att få flera tabellenheter via lagrad procedur med viloläge

'Regler/begränsningar för att använda lagrade procedurer' i vilolägesdokumentation anger att

"Proceduren måste returnera en resultatuppsättning. Observera att eftersom dessa servrar kan returnera flera resultatuppsättningar och uppdateringsantal, kommer Hibernate att iterera resultaten och ta det första resultatet som är en resultatuppsättning som dess returvärde. Allt annat kommer att vara kasseras." (referens:http://docs. jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html#sp_query )

Som sagt ignoreras den andra resultatuppsättningen i ditt fall.

Du skulle behöva använda jdbc för att få båda resultatuppsättningarna. Antingen kan du skapa separata klasser för att göra det, eller alternativt erbjuder hibernate dig metoder för att utföra traditionella jdbc-operationer via sessionens 'doWork' och 'doReturningWork'-metoder...

Ett enkelt exempel kan vara:

List<Object> res = session.doReturningWork(new ReturningWork<List<Object> /*objectType returned*/>() {
            @Override
            /* or object type you need to return to process*/
            public List<Object> execute(Connection conn) throws SQLException 
            {
                CallableStatement cstmt = conn.prepareCall("CALL YOUR_PROCEDURE");
                //Result list that would return ALL rows of ALL result sets
                List<Object> result = new ArrayList<Object>();
                try
                {
                    cstmt.execute();                        

                    ResultSet rs = cstmt.getResultSet(); // First resultset
                    while (rs.next()) {//Read items/rows of first resultset
                        // .
                        // Process rows of first resultset

                        result.add(obj); // add items of resultset 1 to the returning list object
                    }

                    cstmt.getMoreResults(); // Moves to this Statement object's next result, returns true if it is a ResultSet object

                    rs = cstmt.getResultSet(); // Second resultset
                    while (rs.next()) {
                        // .
                        // Process rows of second resultset

                        result.add(obj); // add items of resultset 2 to the returning list object
                    }
                    rs.close();                           
                }
                finally
                {cstmt.close();}

                return result; // this should contain All rows or objects you need for further processing
            }
        });



  1. MySQL tar snabbt bort dubbletter från stor databas

  2. Hur betraktar NULL som MAX-datumet istället för att ignorera det i MySQL?

  3. Oracle Database Link - MySQL-ekvivalent?

  4. Hur man kontrollerar om en tabell finns i SQLite