DB2 – Procedimientos almacenados que devuelven recordsets

Hemos visto ya como crear procedimientos almacenados en PostgreSql y Mysql, ahora toca el turno a Db2.

 En Db2 como en otros Motores de bases de datos la sentencia para crear procedimientos almacenados es CREATE PROCEDURE seguida del nombre del procedimiento y la lista de parámetros.  Puede incluirse el esquema o librería al que pertenecerá anteponiendo el nombre y un signo punto:

CREATE 
PROCEDURE NOMBRELIBRERIA.NOMBREPROCEDIMIENTO
         (PARAMETRO1 TIPO, PARAMETRO2 TIPO,..,OUT PARAMETRON TIPO)

Los parámetros de un procedimiento pueden ser de salida, entrada o ambos, para ello se anteponen los identificadores IN (entrada), OUT (Salida) o INOUT (Entrada y Salida).  De no ser indicado el comportamiento del parámetro Db2 lo considera por defecto solo de entrada o IN.

Establecidos el nombre del procedimiento y su lista de parámetros, se debe indicar el nombre único para el procedimiento usando la sentencia Specific. Esto se hace ya que db2 soporta la sobre carga de procedimientos y funciones y por ello debe indicarse el nombre único del procedimiento que se está compilando. Si deseas conocer más acerca de esto puedes consultar la documentación en línea aquí.

Además del nombre único, debemos indicar que el cuerpo del procedimiento se encuentra codificado en lenguaje SQL y para ello se hace uso de la sentencia LANGUAGE SQL.

De manera adicional y como en el caso que ocupa este artículo, el procedimiento devolverá un Recordset, se debe hacer la indicación que el procedimiento retorna Recordsets con la siguiente sentencia:  RESULT SETS NumeroDeResulteset

El encabezado del procedimiento con lo anterior descrito quedaría así:

CREATE 
PROCEDURE NOMBRELIBRERIA.NOMBREPROCEDIMIENTO
         (PARAMETRO1 TIPO, PARAMETRO2 TIPO,..,OUT PARAMETRON TIPO)

      LANGUAGE SQL
      SPECIFIC NOMBREPROCEDIMIENTO
      RESULT SETS 1

Lo anterior forma parte del encabezado del procedimiento que contiene la definición de los datos de entrada y salida así como el identificador. Ahora indicaremos el inicio del cuerpo del procedimiento con un begin y su fin con un end.

Dado que el artículo está orientado a procedimientos que devuelven recordsets, el cuerpo del procedimiento contendrá la declaración de un cursor de salida para indicar la consulta que genera el recordset  y su apertura que permite al sp devolver el conjunto de datos:

BEGIN
   DECLARE CURDATOS CURSOR WITH RETURN 
       FOR SELECT Campo1, Campo2,..,CampoN
             FROM Libreria.Tabla;

  OPEN CURDATOS;

END;

Como podemos ver en el código anterior, para dar salida a los datos deberemos crear un cursor con la sentencia y usaremos open para dar salida al Recordset.

Este es el bloque completo del sp

 

CREATE 
PROCEDURE NOMBRELIBRERIA.NOMBREPROCEDIMIENTO
         (PARAMETRO1 TIPO, PARAMETRO2 TIPO,..,OUT PARAMETRON TIPO)

      LANGUAGE SQL
      SPECIFIC NOMBREPROCEDIMIENTO
      RESULT SETS 1 

BEGIN
   DECLARE CURDATOS CURSOR WITH RETURN 
       FOR SELECT Campo1, Campo2,..,CampoN
             FROM Libreria.Tabla;

  OPEN CURDATOS;

END;

 Y para ejecutarlo se haría con la siguiente sentencia:

Call NOMBRELIBRERIA.NOMBREPROCEDIMIENTO(val1,val2,..,valn);

2 Comments

1 Trackback / Pingback

  1. DB2 – Sobrecarga de Procedimientos Almacenados. | Blog del Poli

Deja un comentario