sql >> Databasteknik >  >> RDS >> Oracle

Hur man returnerar en anpassad uppsättning i PL/SQL lagrad procedur

Om du inte är särskilt inställd på att använda en samling, skulle det vara enklare att använda en ref-markör:

CREATE OR REPLACE PROCEDURE sample_procedure ( 
   p_some_select_sql_result OUT SYS_REFCURSOR 
) 
AS 
BEGIN
   OPEN p_some_select_sql_result FOR
      SELECT ...
      FROM ...
      JOIN ...
      ... etc.;
END;
/

Från JDBC kan du sedan göra något i stil med:

cStmt = conn.prepareCall('{ call sample_procedure(?) }');
cStmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
cStmt.execute();
rSet = cStmt.getCursor(1);

och du kan sedan iterera över resultatuppsättningen som du skulle göra med alla andra.

Du kan också använda en funktion istället:

CREATE OR REPLACE FUNCTION sample_function RETURN SYS_REFCURSOR
AS 
   l_some_select_sql_result
BEGIN
   OPEN l_some_select_sql_result FOR
      SELECT ...
      FROM ...
      JOIN ...
      ... etc.;

   RETURN l_some_select_sql_result;
END;
/

och

cStmt = conn.prepareCall('{ ?=call sample_function }');
cStmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
cStmt.execute();
rSet = cStmt.getCursor(1);

Uppenbarligen måste du hantera alla andra parametrar som du överför till din verkliga procedur/funktion.



  1. EXECUTE...INTO...USING-satsen i PL/pgSQL kan inte köras i en post?

  2. MySQL:Välj rad för id med föregående och nästa rad efter datum

  3. fel när du använder mysql_real_escape_string()

  4. Hur man fyller i saknade datum i PostgreSQL med generation_series