Ejecute el bloque pl / sql anónimo y obtenga un conjunto de resultados en java

Me gustaría ejecutar el PL / SQL anónimo y necesito obtener el objeto del conjunto de resultados. Obtuve el código que se puede hacer usando cursores dentro del bloque PL / SQL.

Pero el bloque PL / SQL en sí provendrá de la base de datos como texto. Así que no puedo editar ese bloque PL / SQL. Y devolverá solo dos valores cuyos nombres de columna serán siempre iguales. Volverá a la lista de valores de combinación de 2 columnas.

Aquí les doy una muestra de PL / SQL.

BEGIN

RETURN 'select distinct fundname d, fundname r from <table> where condition order by 1';

EXCEPTION
   WHEN OTHERS THEN
    RETURN 'SELECT ''Not Available'' d, ''Not Available'' r FROM dual';
END;

Cualquier respuesta será tan útil.

Aquí hay un ejemplo autocontenido de cómo “ejecutar el PL / SQL anónimo y obtener el objeto del conjunto de resultados”

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Types;

import oracle.jdbc.OracleTypes;

public class CallPLSQLBlockWithOneInputStringAndOneOutputStringParameterAndOneOutputCursorParameter {

    public static void main(String[] args) throws Exception {

        DriverManager.registerDriver(new oracle.jdbc.OracleDriver());

        // Warning: this is a simple example program : In a long running application,
        // error handlers MUST clean up connections statements and result sets.

        final Connection c = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "system", "manager");
        String plsql = "" +
        " declare " +  
        "    p_id varchar2(20) := null; " +
        "    l_rc sys_refcursor;" +
        " begin " +
        "    p_id := ?; " +
        "    ? := 'input parameter was = ' || p_id;" +
        "    open l_rc for " +
        "        select 1 id, 'hello' name from dual " +
        "        union " +
        "        select 2, 'peter' from dual; " +
        "    ? := l_rc;" +
        " end;";

        CallableStatement cs = c.prepareCall(plsql);
        cs.setString(1, "12345");
        cs.registerOutParameter(2, Types.VARCHAR);
        cs.registerOutParameter(3, OracleTypes.CURSOR);

        cs.execute();

        System.out.println("Result = " + cs.getObject(2));

        ResultSet cursorResultSet = (ResultSet) cs.getObject(3);
        while (cursorResultSet.next ())
        {
            System.out.println (cursorResultSet.getInt(1) + " " + cursorResultSet.getString(2));
        } 
        cs.close();
        c.close();
    }
}

La consulta de ejemplo anterior “select 1 id, nombre ‘hello’ de dual union select 2, ‘peter’ from dual;” Puede ser reemplazado por cualquier consulta.

Por favor indique la dirección original:Ejecute el bloque pl / sql anónimo y obtenga un conjunto de resultados en java