123 - Procedimientos almacenados (parámetros de salida) |
Dijimos que los procedimientos almacenados pueden devolver información; para ello se emplean parámetros de salida. El valor se retorna a quien realizó la llamada con parámetros de salida. Para que un procedimiento almacenado devuelva un valor se debe declarar una variable con la palabra clave "output" al crear el procedimiento:
create procedure NOMBREPROCEDIMIENTO @PARAMETROENTRADA TIPO =VALORPORDEFECTO, @PARAMETROSALIDA TIPO=VALORPORDEFECTO output as SENTENCIAS select @PARAMETROSALIDA=SENTENCIAS;
Los parámetros de salida pueden ser de cualquier tipo de datos, excepto text, ntext e image.
Creamos un procedimiento almacenado al cual le enviamos 2 números y retorna el promedio:
create procedure pa_promedio @n1 decimal(4,2), @n2 decimal(4,2), @resultado decimal(4,2) output as select @resultado=(@n1+@n2)/2;
Al ejecutarlo también debe emplearse "output":
declare @variable decimal(4,2) execute pa_promedio 5,6, @variable output select @variable;
Declaramos una variable para guardar el valor devuelto por el procedimiento; ejecutamos el procedimiento enviándole 2 valores y mostramos el resultado.
La instrucción que realiza la llamada al procedimiento debe contener un nombre de variable para almacenar el valor retornado.
Creamos un procedimiento almacenado que muestre los títulos, editorial y precio de los libros de un determinado autor (enviado como parámetro de entrada) y nos retorne la suma y el promedio de los precios de todos los libros del autor enviado:
create procedure pa_autor_sumaypromedio @autor varchar(30)='%', @suma decimal(6,2) output, @promedio decimal(6,2) output as select titulo,editorial,precio from libros where autor like @autor select @suma=sum(precio) from libros where autor like @autor select @promedio=avg(precio) from libros where autor like @autor;
Ejecutamos el procedimiento y vemos el contenido de las variables en las que almacenamos los parámetros de salida del procedimiento:
declare @s decimal(6,2), @p decimal(6,2) execute pa_autor_sumaypromedio 'Richard Bach', @s output, @p output select @s as total, @p as promedio;