Ir al contenido principal

Como retornar resultados implícitamente de un SELECT usando procedimientos almacenados

Oracle desde la versión 11g permite retornar un conjunto resultado de una sentencia SELECT de modo implícito (sin usar una variable de tipo sys_refcursor como parámetro de salida) invocando a la función RETURN_RESULT del paquete DBMS_SQL.

SYS_REFCURSOR es un tipo de datos que representa un cursor o área de memoria donde se almacena temporalmente un conjunto resultado permitiendo recuperar una a una cada fila.
 
A continuación se presenta un ejemplo que recupera filas de la tabla empleados:

create or replace procedure select_employees as

  rf_cursor_employees SYS_REFCURSOR;
begin
 
  open rf_cursor_employees for
    SELECT employee_id,first_name,last_name,salary,email,phone_number
      FROM HR.employees
    ORDER BY last_name,first_name;
   
    dbms_sql.return_result(rf_cursor_employees);
   
end select_employees;

Compilar  con Oracle SQL Developer o SQL*Plus:



Para su ejecución, se invoca al procedimiento SELECT_EMPLOYEES:

exec select_employees; 


Se puede recuperar más de un conjunto resultado al igual que se lo hace con la forma tradicional empleando variables de tipo  sys_refcursor en lugar de parámetros como se ilustra en el siguiente caso :

create or replace procedure select_multiples_resultados as
 rf_cursor_departments SYS_REFCURSOR;
 rf_cursor_employees SYS_REFCURSOR;

begin
  open rf_cursor_departments for
     SELECT
         department_id,department_name
     FROM HR.departments
     ORDER BY department_name;
    
    dbms_sql.return_result(rf_cursor_departments);

  open rf_cursor_employees for
    SELECT employee_id,first_name,last_name,salary,email,phone_number
    FROM HR.employees
    ORDER BY last_name,first_name;
   
    dbms_sql.return_result(rf_cursor_employees);
   
end select_multiples_resultados;
 
Compilar con SQL Developer o SQL*PLus.

Ejecutar el procedimiento:

exec select_multiples_resultados;



Conclusión:

Por medio de la función RETURN_RESULT se puede obtener uno o varios conjuntos resultado sin declarar parámetros de tipo SYS_REFCURSOR en los  procedimientos, sino, como variables locales del mismo facilitando el trabajo de codificación.
 
Nota:




Comentarios

Anónimo dijo…
Muy buenas!

Muchas gracias por el post. Estoy probando a ejecutarlo desde java con un CallableStatement o desde una query con jdbc pero no lo consigo, ¿podrías dar un ejemplo?

Muchas gracias!

Alicia.
Hola, disculpa la demora, espero que este link pueda servirte de ayuda:
https://blog.jooq.org/how-to-fetch-oracle-12c-implicit-cursors-with-jdbc-and-jooq/

Cordiales.
Hola, tomo "prestados" estos ejemplos de la documentación de Oracle:
https://docs.oracle.com/database/121/JJDBC/getsta.htm#JJDBC29004

============Código PL/SQL============
create procedure foo as
c1 sys_refcursor;
c2 sys_refcursor;
begin
open c1 for select * from hr.employees;
dbms_sql.return_result(c1); --return to client
-- open 1 more cursor
open c2 for select * from hr.departments;
dbms_sql.return_result (c2); --return to client
end;

============Código Java============
String sql = "begin foo; end;";
...
Connection conn = DriverManager.getConnection(jdbcURL, user, password);
try {
Statement stmt = conn.createStatement ();
stmt.executeQuery (sql);

while (stmt.getMoreResults())
{
ResultSet rs = stmt.getResultSet();
System.out.println("ResultSet");
while (rs.next())
{
/* get results */
}
}
}

Cordiales.

Entradas más populares de este blog

Crear y Administrar Espacios de Tablas(Tablespaces) Parte 1

Los Espacios de Tablas o Tablespaces permiten agrupar lógicamente los datafiles o archivos de datos donde se almacenan físicamente los datos de las tablas de usuarios y del sistema. Oracle en todas sus ediciones cuenta por defecto con 5 tablespaces: SYS SYSTEM UNDO TEMP USERS Cada espacio de tabla tiene una función definida que se muestra en la tabla siguiente: TABLESPACE DESCRIPCIÓN SYSTEM Almacena información acerca de los datos de la base de datos. SYSAUX "Es un tablespace que nace en 9i para dar soporte a los diferentes features de Oracle que necesitan crear segmentos dentro de la base de datos, por ejemplo AWR en 10g."  http://www.forosdelweb.com/f100/tablespace-sysaux-606358/ UNDO Sirve para retener los cambios que se realizan sobre los datos en Oracle y así poder deshacerlos. TEMP Contiene datos temporales o no permanentes  que permanecen únicamente por la duración de la sesión, es decir, que una vez que la sesión termina, estos datos son bo

Como conectarse a Oracle Database XE desde la línea de comandos.

Oracle Database XE puede ser accedida desde la aplicación SQL*Plus, que es un programa de líneas de comandos SQL. Para acceder a SQL*PLus, existen dos métodos: Primero: Inicio>Todos los programas>Base de datos Oracle 10g/11g  Express Edition>Ejecutar Línea de comandos SQL.                     En el caso de Oracle Database 18c Express Edition para Windows:  Inicio>Oracle-OraDB18Home1>SQLPlus Se visualiza la ventan de SQLPlus y se activa un promptuario SQL> que antecede a cualquier comando SQL. Para establecer la conexión al servidor Oracle, ingrese el comando: SQL> conn system (presione ENTER) Introduzca la contraseña: La contraseña es la establecida por Usted al momento de instalar Oracle.(A no ser que la haya cambiado). Presione Enter. Se visualizará el mensaje: Conectado .   A continuación se activa el prompter SQL> Ahora podemos enviar mandatos SQL al servidor XE. Para empezar, crearemos un nuevo usuario llamado MUSICAL. La

Crear usuarios, asignar y revocar roles en Oracle XE con SQL Developer

Es habitual crear y administrar usuarios y roles por medio de líneas de comando usando SQL PLUS, sin embargo muchos de estos procesos pueden  realizarse por medio de Oracle SQL Developer que es la herramienta gráfica desarrollada en Java para cubrir de modo visual las tareas mencionadas. Crear un usuario con Oracle SQL Developer 1.   Iniciar  Oracle SQL Developer 2. Abrir la conexión de usuario SYSTEM configurada para XEPDB1 o cualquier otra PDB disponible. Si no cuenta con una conexión basada en el usuario SYSTEM, ver el siguiente post . 3.   En el panel Conexión se desplegarán los nodos de la conexión abierta y seleccionar la carpeta Usuarios.   4.   Click con botón secundario y seleccionar Crear Usuario . 5.   Llenar los datos en el formulario Crear Usuario. 6.   Click en Roles Otorgados. Seleccionar CONNECT y RESOURCE .   7.   Seleccionar Cuotas. Seleccionar USERS y establecer 300 en la columna Cuota y M en Unidades. Opcional.- Click en S