Vous êtes sur la page 1sur 6

/*FUNCIONES DEL SQL

Son pequeños programas que realizan una tarea específica.


Tienen variables de input o de entrada y retornan un sólo dato o un
conjunto de datos en una tabla.
Son de dos tipos:
1) Funcion escalar
2) Funcion que retorna una tabla.
*/
/* 1) FUNCION ESCALAR
Son aquellas funciones que sólo retornan un único dato y esto puede
ser de tipo: char, varchar, int, smallint, decimal o date.
EJERCICIOS:
1) CREAR UNA FUNCION QUE RECIBA TRES (3) NUMEROS
ENTEROS Y RETORNE EL MAYOR DE ELLOS
*/
USE SUPERMERCADO
GO
CREATE FUNCTION MAYOR3(@N1 INT, @N2 INT, @N3 INT)
RETURNS INT
AS
BEGIN
DECLARE @MAYOR INT
SET @MAYOR=@N1
IF(@N2>@MAYOR)
SET @MAYOR=@N2
IF(@N3>@MAYOR)
SET @MAYOR=@N3
RETURN @MAYOR
END
GO
/* 2) CREAR UNA FUNCION QUE RETORNE EL PRECIO DE UN
PRODUCTO.
*/
CREATE FUNCTION PRECIO(@COD CHAR(6))
RETURNS DECIMAL(7,2)
AS
BEGIN
DECLARE @PRECIO DECIMAL(7,2)
SET @PRECIO= (SELECT PRECIO FROM PRODUCTOS WHERE
CODPROD=@COD)
1
RETURN @PRECIO
END
GO
--EJECUTANDO FUNCION
SELECT dbo.PRECIO('P003') "PRECIO"
GO
SELECT * FROM PRODUCTOS
GO
/*3) CREAR UNA FUNCION QUE RETORNE EL IGV (18%) DE UN
PRODUCTO. SUGERENCIA: USAR FUNCION PRECIO.
*/
CREATE FUNCTION IGV(@COD CHAR(6))
RETURNS DECIMAL(7,2)
AS
BEGIN
RETURN 0.18*(SELECT dbo.PRECIO(@COD))
END
GO
--EJECUTANDO
Select dbo.IGV('P003') "IGV"
GO
/*4) CREAR UNA FUNCION QUE RETORNE EL PRECIO TOTAL DE
UN PRODUCTO= PRECIO + IGV.
SUGERENCIA: USAR FUNCION PRECIO E IGV.
*/
CREATE FUNCTION PRECIO_TOTAL(@COD CHAR(6))
RETURNS DECIMAL(7,2)
AS
BEGIN
RETURN (SELECT dbo.PRECIO(@COD))+(SELECT
dbo.IGV(@COD))
END
GO
--EJECUTANDO
SELECT dbo.PRECIO_TOTAL('P003') "PRECIO TOTAL"
GO

2
/* 2) FUNCIONES QUE RETORNAN TABLAS
EJERCICIOS:
1) CREAR UNA FUNCION QUE RETORNE LOS NOMBRES DE LOS
PRODUCTOS.
*/
CREATE FUNCTION LISTA_PRODUCTOS()
RETURNS TABLE
AS
RETURN (SELECT NOMPROD "PRODUCTO" FROM PRODUCTOS)
GO
--EJECUTAMOS FUNCION
SELECT * FROM dbo.LISTA_PRODUCTOS()
GO
SELECT * FROM dbo.LISTA_PRODUCTOS() ORDER BY 1 ASC
GO
/* 2) CREAR UNA FUNCION QUE LISTE EL NOMBRE, NOMBRE DE
DISTRITO Y TELEFONO, DE LOS CLIENTES QUE VIVIAN EN UN
DETERMINADO NOMBRE DE DISTRITO
*/
--SOLUCION 1)
--USANDO SELECT STANDARD ANSI
CREATE FUNCTION LISTA_CLIENTES1(@DISTRITO
VARCHAR(30))
RETURNS TABLE
AS
RETURN(SELECT NOMCLI "CLIENTE", NOMDIS "DISTRITO", TELEF
"TELEFONO" FROM CLIENTES C, DISTRITOS D WHERE
C.CODDIS=D.CODDIS AND NOMDIS LIKE @DISTRITO)
GO
--EJECUTANDO FUNCION
SELECT * FROM dbo.LISTA_CLIENTES1('%') ORDER BY 2 ASC
GO
SELECT * FROM dbo.LISTA_CLIENTES1('A%')
GO
SELECT * FROM dbo.LISTA_CLIENTES1('%A')
GO
SELECT * FROM dbo.LISTA_CLIENTES1('CALLAO')
GO
-- SOLUCION 2)
--USANDO: INNER JOIN
3
CREATE FUNCTION LISTA_CLIENTES2(@DISTRITO VARCHAR(30)
)
RETURNS TABLE
AS
RETURN (SELECT NOMCLI "CLIENTE", NOMDIS "DISTRITO", TELEF
"TELEFONO" FROM CLIENTES C INNER JOIN DISTRITOS D ON
C.CODDIS=D.CODDIS AND NOMDIS LIKE @DISTRITO)
GO
--EJECUTANDO FUNCION
SELECT * FROM dbo.LISTA_CLIENTES2('%') ORDER BY 2 ASC
GO
SELECT * FROM dbo.LISTA_CLIENTES2('A%')
GO
SELECT * FROM dbo.LISTA_CLIENTES2('%A')
GO
SELECT * FROM dbo.LISTA_CLIENTES2('CALLAO')
GO
/* 3) CREAR UNA FUNCION QUE LISTE EL NOMBRE DE
PRODUCTO, EL NOMBRE DE MARCA, EL NOMBRE DE
CATEGORIA, PRECIO Y STOCK DE LOS TRES PRODUCTOS DE
MAYOR PRECIO.
USAR SELECT STANDARD Y SELECT CON INNER JOIN.
LUEGO ORDENAR TABLA POR PRECIO DESC.
*/
--SOLUCION 1)
--USANDO SELECT STANDARD ANSI
CREATE FUNCTION LISTADO1()
RETURNS TABLE
AS
RETURN(SELECT TOP 3 NOMPROD "PRODUCTO", NOMMAR
"MARCA", NOMCAT "CATEGORIA",PRECIO, STOCK FROM
PRODUCTOS P,MARCAS M, CATEGORIAS C WHERE
P.CODMAR=M.CODMAR AND P.CODCAT=C.CODCAT
ORDER BY PRECIO DESC)
GO
--EJECUCION
SELECT * FROM dbo.LISTADO1()
GO
--SOLUCION 2)
--USANDO INNER JOIN
4
CREATE FUNCTION LISTADO2()
RETURNS TABLE
AS
RETURN (SELECT TOP 3 NOMPROD "PRODUCTO", NOMMAR
"MARCA", NOMCAT "CATEGORIA", PRECIO, STOCK FROM
PRODUCTOS P INNER JOIN MARCAS M ON
P.CODMAR=M.CODMAR INNER JOIN CATEGORIAS C ON
P.CODCAT= C.CODCAT ORDER BY PRECIO DESC)
GO
--EJECUCION
SELECT * FROM dbo.LISTADO2()
GO
/* 4) CREAR UNA FUNCION QUE LISTE EL NOMBRE DE
PERSONAL, NOMBRE DE DISTRITO, FECHA DE NACIMIENTO Y
EDAD DEL PERSONAL QUE SEA MAYOR A UNA DETERMINADA
EDAD.
LUEGO ORDENAR TABLA POR EDAD DESC.
*/
CREATE FUNCTION LIST_PERSONAL(@EDAD INT)
RETURNS TABLE
AS
RETURN (SELECT NOMPER "NOMBRE", NOMDIS "DISTRITO",
FNAC "FEC.NAC", YEAR(GETDATE())-YEAR(FNAC) "EDAD" FROM
PERSONAL P, DISTRITOS D WHERE P.CODDIS=D.CODDIS AND
YEAR(GETDATE())-YEAR(FNAC)>@EDAD)
GO
-- EJECUTANDO FUNCION
SELECT * from dbo.LIST_PERSONAL(29) ORDER BY 4 DESC
GO
/* 5) CREAR UNA FUNCION QUE LISTE EL CODIGO, NOMBRE Y
TELEFONO DE LOS CLIENTES QUE NO COMPRARON EN UN AÑO
DETERMINADO.
LUEGO ORDENAR TABLA POR NOMBRE DESC.
*/
CREATE FUNCTION LIST_CLIENTES(@AÑO INT)
RETURNS TABLE
AS
RETURN(SELECT CODCLI "CODIGO", NOMCLI "NOMBRE", TELEF
"TELEFONO" FROM CLIENTES WHERE CODCLI NOT IN (SELECT
CODCLI FROM COMP_CABECERA WHERE YEAR(FECHA)=@AÑO))
5
GO
--EJECUTANDO FUNCION
SELECT * FROM dbo.LIST_CLIENTES(2015) ORDER BY 2 ASC
GO
/* 6) CREAR UNA FUNCION QUE LISTE EL CODIGO, NOMBRE Y
PRECIO DE LOS PRODUCTOS QUE SE VENDIERON ENTRE UNA
FECHA INICIAL Y OTRA FECHA FINAL.
LUEGO ORDENAR TABLA POR PRECIO DESC.
*/
CREATE FUNCTION LISTADO_PRODUCTOS(@FECHA1
DATE,@FECHA2 DATE)
RETURNS TABLE
AS
RETURN(SELECT CODPROD "CODIGO", NOMPROD "NOMBRE",
PRECIO FROM PRODUCTOS WHERE CODPROD IN (SELECT
CODPROD FROM COMP_CABECERA CC,COMP_DETALLE CD
WHERE C.CODCOM=CD.CODCOM AND FECHA BETWEEN
@FECHA1 AND @FECHA2))
GO
--EJECUTANDO FUNCION
SELECT * FROM dbo.LISTADO_PRODUCTOS('01/15/15','12/15/15')
ORDER BY 3 ASC
GO

Vous aimerez peut-être aussi