136 - Funciones de tabla de varias instrucciones |
Trabajamos con la tabla "libros" de una librería.
Eliminamos la tabla, si existe y la creamos con la siguiente estructura:
if object_id('libros') is not null
drop table libros;
create table libros(
codigo int identity,
titulo varchar(40),
autor varchar(30),
editorial varchar(20),
precio decimal(6,2)
);
Ingresamos algunos registros:
insert into libros values('Uno','Richard Bach','Planeta',15);
insert into libros values('Ilusiones','Richard Bach','Planeta',10);
insert into libros values('El aleph','Borges','Emece',25);
insert into libros values('Aprenda PHP','Mario Molina','Siglo XXI',55);
insert into libros values('Alicia en el pais','Lewis Carroll','Paidos',35);
insert into libros values('Matematica estas ahi','Paenza','Nuevo siglo',25);
Eliminamos la función "f_ofertas" si existe":
if object_id('f_ofertas') is not null
drop function f_ofertas;
Creamos la función "f_ofertas" que reciba un parámetro correspondiente a un precio y nos retorne una tabla con código, título, autor y precio de todos los libros cuyo precio sea inferior al parámetro:
create function f_ofertas
(@minimo decimal(6,2)
)
returns @ofertas table-- nombre de la tabla
--formato de la tabla
(codigo int,
titulo varchar(40),
autor varchar(30),
precio decimal(6,2)
)
as
begin
insert @ofertas
select codigo,titulo,autor,precio
from libros
where precio<@minimo
return
end;
Llamamos a la función como si fuera una tabla, recuerde que podemos omitir el nombre del propietario:
select *from f_ofertas(30);
Realizamos un join entre "libros" y la tabla retornada por la función "f_ofertas" y mostramos todos los campos de "libros". Incluimos una condición para el autor:
select l.titulo,l.autor,l.editorial from libros as l join dbo.f_ofertas(25) as o on l.codigo=o.codigo where l.autor='Richard Bach';
La siguiente consulta nos retorna algunos campos de la tabla retornada por "f_ofertas" y algunos registros que cumplen con la condición "where":
select titulo,precio from f_ofertas(40) where autor like '%B%';
Eliminamos la función "f_listadolibros" si existe":
if object_id('f_listadolibros') is not null
drop function f_listadolibros;
Creamos otra función que retorna una tabla:
create function f_listadolibros
(@opcion varchar(10)
)
returns @listado table
(titulo varchar(40),
detalles varchar(60)
)
as
begin
if @opcion not in ('autor','editorial')
set @opcion='autor'
if @opcion='editorial'
insert @listado
select titulo,
(editorial+'-'+autor) from libros
order by 2
else
if @opcion='autor'
insert @listado
select titulo,
(autor+'-'+editorial) from libros
order by 2
return
end;
Note que si el valor enviado al parámetro no está incluido en la lista de valores especificada, se setea el parámetro con el valor "autor".
Llamamos a la función enviando el valor "autor":
select *from dbo.f_listadolibros('autor');
Llamamos a la función enviando el valor "editorial":
select *from dbo.f_listadolibros('editorial');
Llamamos a la función enviando un valor inválido:
select *from dbo.f_listadolibros('precio');