Anda di halaman 1dari 17

Bases de Datos II Ingeniera Informtica - UNT

Docente: Ing. Arturo Daz Pulido.


FUNCIONES EN SQL
Existen dos tipos de funciones:
o Funciones a nivel de fila
o Funciones a nivel de mltiples filas
Funciones a nivel de fila. Tipos:
o Carcter
o Nmero
o Fecha
o Conversin
Funciones a nivel de grupo. Tipos:
o Manipulan grupos de filas y devuelven un resultado por cada uno de
ellos.
Funciones de Caracteres
Pueden ser de dos tipos:
o Funciones de conversin
o Funciones de manipulacin de caracteres
De manipulacin de caracteres:
o CONCAT
o SUBSTR
o LENGTH
o INSTR
o LPAD Y RPAD
De conversin:
o LOWER , UPPER e INITCAP
Funciones de conversin caracteres
LOWER: Convierte a minsculas.
UPPER: Convierte a maysculas.
INITCAP: Convierte la primera letra de cada palabra en maysculas, y el resto en
minscula.
Bases de Datos II Ingeniera Informtica - UNT


Docente: Ing. Arturo Daz Pulido.
Atencin: Usar una funcin de conversin dentro de la clusula WHERE puede ser
altamente ineficiente porque si la columna afectada forma parte de un ndice ste lo
desactiva, provocando un bajo rendimiento.
Funciones manipulacin caracteres
CONCAT: Concatena dos valores.
SUBSTR: Extrae una subcadena.
LENGTH: Devuelve la longitud de la cadena.
INSTR: Devuelve la posicin de un carcter o subcadena.
LPAD: Justifica a la derecha la cadena.
RPAD: Justifica a la izquierda la cadena.
Funciones Numricas
ROUND (columna | expresin, n)
o Redondea a n posiciones decimales. Si se omite n, no se redondea con
decimales. Si n es negativo, los nmeros a la izquierda del punto decimal
se redondean a decenas, centenas, ...
TRUNC (columna | expresin, n)
o Trunca en la ensima posicin decimal. Si se omite n, sin lugares
decimales. Si n es negativo, los nmeros a la izquierda del punto decimal
se truncan a cero.
MOD (m, n)
o Devuelve el resto de la divisin de m por n.
Ejemplos de funciones numricas
SQL> SELECT ROUND(45.923, 2), ROUND(45.923, 0), ROUND(45.923, -1)
FROM SYS.DUAL;
Resultado: 45.92 46 50
SQL> SELECT TRUNC(45.923, 2), TRUNC(45,923), TRUNC(45.923, -1)
FROM SYS.DUAL;
Resultado: 45.92 45 40
Trabajando con fechas
Oracle almacena fechas en un formato numrico interno de 7 bytes:
o Siglo, ao, mes, da, horas, minutos, segundos
Bases de Datos II Ingeniera Informtica - UNT


Docente: Ing. Arturo Daz Pulido.
El formato de fecha por defecto es DD-MON-YY
SYSDATE es una funcin que devuelve fecha y hora (pseudocolumna del sistema)
DUAL es una tabla virtual de la bd., que puede ser usada para inspeccionar
SYSDATE.
Operadores aritmticos de fechas
Sumar o restar un nmero a/o de una fecha da por resultado una fecha.
Restar dos fechas para encontrar la cantidad de das entre esas fechas.
Sumar horas a una fecha dividiendo la cantidad de horas por 24.
Funciones de Fecha (I)
MONHTS_BETWEEN (fecha1, fecha2)
o Nmero de meses entre dos fechas. El resultado puede ser positivo o
negativo.
ADD_MONTHS (fecha, n)
o Aade n meses a fecha, segn calendario. N debe de ser un nmero
entero y puede ser negativo.
NEXT_DAY (fecha, caracter)
o Devuelve la fecha del da especificado (carcter) siguiente a fecha.
Carcter puede ser un nmero representando un da o una cadena de
caracteres, p.ej. FRIDAY.
Funciones de Fecha (II)
LAST_DAY (fecha)
o Devuelve la fecha del ltimo da del mes que contiene fecha.
ROUND (fecha [,fmt])
o Cuando no se especifica ningn formato, devuelve la fecha del primer
da del mes contenido en fecha. Si fmt=YEAR, encuentra el primer da
del ao.
TRUNC (fecha [,fmt])
o Devuelve la fecha con la porcin del da truncado en la unidad
especificada por el modelo de formato fmt. Si se omite el formato, laf
echa se trunca en el da ms prximo.
Ejemplos funciones de fecha
Bases de Datos II Ingeniera Informtica - UNT


Docente: Ing. Arturo Daz Pulido.
MONTS_BETWEEN (01-SEP-95, 11-JAN-94) 19.6774194
ADD_MONTHS(11-JAN-94, 6) 11-JUL-94
NEXT_DAY (01-SEP-95, FRIDAY) 08-SEP-95
LAST_DAY (01-SEP-95) 30-SEP-95
ROUND (25-JUL-95, MONTH) 01-AUG-95
ROUND (25-JUL-95, YEAR) 01-JAN-96
TRUNC (25-JUL-95, MONTH) 01-JUL-95
TRUNC (25-JUL-95, YEAR) 01-JAN-95
Formatos de Fecha (I)
YYYY / YEAR
o Ao completo en nmero / Ao en letras
MM / MONTH
o N del mes con dos dgitos / Nombre completo del mes
DY / DAY
o Da de la semana en tres letras / Nombre completo del da
fm (fill mode)
o Elimina los espacios en blanco de relleno o suprime ceros a la izquierda
Formatos de Fecha (II)
Obtencin de la hora:
o HH / HH12 / HH24
Hora del da / Hora (1-12) / Hora (1-24)
o MI / SS / SSSS
Minutos / Segundos / Segundos despus de medianoche
o AM o PM
Indicador del Meridiano
o Sufijo SP / SPTH o THSP
Deletreo del nmero / Deletreo nmeros ordinales
o Se permiten literales
Funciones de conversin (I)
Bases de Datos II Ingeniera Informtica - UNT


Docente: Ing. Arturo Daz Pulido.
La conversin de tipos de datos puede ser:
IMPLCITA: Realizada automticamente por Oracle
EXPLCITA: El usuario es quien la realiza
Conversin Implcita de datos
De VARCHAR2 o CHAR a NUMBER
De VARCHAR2 o CHAR a DATE
De NUMBER a VARCHAR2
De DATE a VARCHAR2
o Estas conversiones se realizan por asignaciones, si Oracle 8 puede
convertir el tipo de dato del valor utilizado en la asignacin en el tipo de
dato que era el objetivo de la asignacin.
Funciones de conversin (II)
TO_CHAR (nmero | fecha [,fmt])
o Convierte un nmero o fecha en una cadena de caracteres VARCHAR2
con el modelo de formato fmt.
9: Representa un nmero
0: Fuerza a que se muestra el cero
$: Signo de dlar
L: Usa el signo de moneda local
.: Imprime el punto decimal
;: Imprime el indicador de millar
Para fechas, los fmt anteriores.
Funciones de conversin (III)
TO_NUMBER (char)
o Convierte una cadena de caracteres con dgitos en un nmero.
TO_DATE (char [,fmt])
o Convierte una cadena de caracteres representando una fecha en un
valor de fecha segn el fmt especificado. Si se omite el fmt, el formato
es DD-MON-YY.
NVL (expr1, expr2)
o Convierte un nulo (expr1) a un valor de tipo fecha, cadena o nmero
(expr2).
Bases de Datos II Ingeniera Informtica - UNT


Docente: Ing. Arturo Daz Pulido.
La Funcin DECODE

Hace las veces de sentencia CASE o IF-THEN-ELSE, para facilitar consultas
condicionales.
o Descifra una expresin despus de compararla con cada valor de
bsqueda. Si la expresin es la misma que la bsqueda, se devuelve el
resultado. Si se omite el valor por defecto, se devolver un valor nulo
donde una bsqueda no coincida con ninguno de los valores resultantes.
Uso de DECODE
SQL>SELECT job, sal,
DECODE (job, ANALYST, sal*1.1, CLERK, sal*1.15, MANAGER, sal*1.20, sal) AS
Nuevo salario
FROM emp;
Si job = ANALYST entonces el salario se incrementa en un 10%
Si job = CLERK entonces se incrementa en un 15%
Si jog = MANAGER entonces se incrementa en un 20%
Para otro caso, entones no hay incremento de salario

Bases de Datos II Ingeniera Informtica - UNT


Docente: Ing. Arturo Daz Pulido.
Funciones en Transact SQL
SQL Server proporciona al usuario la posibilidad de definir sus propias funciones, conocida como
UDF (user defined functions). Exisiten tres tipos de funciones. Estas son:
Funciones escalares.
Funciones en lnea.
Funciones en lnea de multiples sentencias
Funciones escalares
Las funciones escalares devuelven un nico valor de cualquier tipo de los datos tal como int,
money, varchar, real, etc.
La sintaxis para una funcin escalar es la siguiente:

CREATE FUNCTION <Scalar_Function_Name, sysname, FunctionName>
(
-- Lista de parmetros
<@Param1, sysname, @p1> <Data_Type_For_Param1, , int>, ...
)
-- Tipo de datos que devuelve la funcin.
RETURNS <Function_Data_Type, ,int>
AS
BEGIN
...
END
El siguiente ejemplo muestra cmo crear una funcin escalar.

CREATE FUNCTION fn_MultiplicaSaldo
(
@NumCuenta VARCHAR(20),
Bases de Datos II Ingeniera Informtica - UNT


Docente: Ing. Arturo Daz Pulido.
@Multiplicador DECIMAL(10,2)
)
RETURNS DECIMAL(10,2)
AS
BEGIN
DECLARE @Saldo DECIMAL(10,2),
@Return DECIMAL(10,2)
SELECT @Saldo = SALDO
FROM CUENTAS
WHERE NUMCUENTA = @NumCuenta

SET @Return = @Saldo * @Multiplicador

RETURN @Return
END
Pueden ser utilizadas en cualquier sentencia Transact SQL. Un aspecto a tener en cuenta, es que
para utilizar una funcin escalar debemos identificar el nombre de la funcin con el propietario de
la misma.
El siguiente ejemplo muestra como utilizar la funcin anteriormente creada en una sentencia
Transact SQL. Un aspecto muy a tener en cuenta es que la funcin ejecutar sus sentencias
SELECT una vez por cada fila del conjunto de resultados devuelto por la consulta SELECT principal.

SELECT IDCUENTA,
NUMCUENTA,
SALDO,
FXALTA,
Bases de Datos II Ingeniera Informtica - UNT


Docente: Ing. Arturo Daz Pulido.
-- Ejecucion de la funcion:
dbo.fn_MultiplicaSaldo( NUMCUENTA, IDCUENTA) AS RESULTADO
FROM CUENTAS
El siguiente ejemplo muestra como utilizar una funcin escalar en un script Transact SQL.

DECLARE @NumCuenta VARCHAR(20),
@Resultado DECIMAL(10,2)
SET @NumCuenta = '200700000001'
SET @Resultado = dbo.fn_MultiplicaSaldo(@NumCuenta, 30.5)
PRINT @Resultado
Las funciones escalares son muy similares a procedimientos almacenados con parmetros de
salida, pero estas pueden ser utilizadas en consultas de seleccion y en la clausula where de las
mismas.
Las funciones no pueden ejecutar sentencias INSERT o UPDATE.
Funciones en linea
Las funciones en linea son las funciones que devuelven un conjunto de resultados
correspondientes a la eecucin de una sentencia SELECT.
La sintaxis para una funcin de tabla en linea es la siguiente:

CREATE FUNCTION <Inline_Function_Name, sysname, FunctionName>
(
-- Lista de parmetros
<@param1, sysname, @p1> <Data_Type_For_Param1, , int>,...
)
RETURNS TABLE
Bases de Datos II Ingeniera Informtica - UNT


Docente: Ing. Arturo Daz Pulido.
AS
RETURN
(
-- Sentencia Transact SQL
)
El siguiente ejemplo muestra como crear una funcin en linea.

CREATE FUNCTION fn_MovimientosCuenta
(
@NumCuenta VARCHAR(20)
)
RETURNS TABLE
AS
RETURN
(
SELECT MOVIMIENTOS.*
FROM MOVIMIENTOS
INNER JOIN CUENTAS ON MOVIMIENTOS.IDCUENTA = CUENTAS.IDCUENTA
WHERE CUENTAS.NUMCUENTA = @NumCuenta
)
No podemos utilizar la clausula ORDER BY en la sentencia de una funcin el lnea.
Las funciones en linea pueden utilizarse dentro de joins o querys como si fueran una tabla
normal.

SELECT * FROM fn_MovimientosCuenta('200700000001')
Bases de Datos II Ingeniera Informtica - UNT


Docente: Ing. Arturo Daz Pulido.

SELECT *
FROM CUENTAS
INNER JOIN CUENTAS_CLIENTE
ON CUENTAS_CLIENTE.IDCUENTA = CUENTAS.IDCUENTA
INNER JOIN CLIENTES
ON CLIENTES.id = CUENTAS_CLIENTE.IDCLIENTE
INNER JOIN fn_MovimientosCuenta('200700000001') A
ON A.IDCUENTA= CUENTAS.IDCUENTA
Funciones en lnea de multiples sentencias
Las funciones en lnea de multiples sentencias son similares a las funciones en lnea excepto que
el conjunto de resultados que devuelven puede estar compuesto por la ejecucin de varios
consultas SELECT.
Este tipo de funcin se usa en situaciones donde se requiere una mayor lgica de proceso.
La sintaxis para una funciones de tabla de multi sentencias es la siguiente:

CREATE FUNCTION <Table_Function_Name, sysname, FunctionName>
(
-- Lista de parmetros
<@param1, sysname, @p1> <data_type_for_param1, , int>, ...
)
RETURNS
-- variable de tipo tabla y su estructura
<@Table_Variable_Name, sysname, @Table_Var> TABLE
(
<Column_1, sysname, c1> <Data_Type_For_Column1, , int>,
<Column_2, sysname, c2> <Data_Type_For_Column2, , int>
Bases de Datos II Ingeniera Informtica - UNT


Docente: Ing. Arturo Daz Pulido.
) AS
BEGIN
-- Sentencias que cargan de datos la tabla declarada
RETURN
END
El siguiente ejemplo muestra el uso de una funcion de tabla de multi sentencias.

/* Esta funcion busca la tres cuentas con mayor saldo
* y obtiene los tres ltimos movimientos de cada una
* de estas cuentas
*/

CREATE FUNCTION fn_CuentaMovimietos()
RETURNS @datos TABLE
( -- Estructura de la tabla que devuelve la funcion.
NumCuenta varchar(20),
Saldo decimal(10,2),
Saldo_anterior decimal(10,2),
Saldo_posterior decimal(10,2),
Importe_Movimiento decimal(10,2),
FxMovimiento datetime
)
AS
BEGIN
Bases de Datos II Ingeniera Informtica - UNT


Docente: Ing. Arturo Daz Pulido.
-- Variables necesarias para la lgica de la funcion.
DECLARE @idcuenta int,
@numcuenta varchar(20),
@saldo decimal(10,2)

-- Cursor con las 3 cuentas de mayor saldo
DECLARE CDATOS CURSOR FOR
SELECT TOP 3 IDCUENTA, NUMCUENTA, SALDO
FROM CUENTAS
ORDER BY SALDO DESC

OPEN CDATOS
FETCH CDATOS INTO @idcuenta, @numcuenta, @saldo

-- Recorremos el cursor
WHILE (@@FETCH_STATUS = 0)
BEGIN
-- Insertamos la cuenta en la variable de salida
INSERT INTO @datos
(NumCuenta, Saldo)
VALUES
(@numcuenta, @saldo)
-- Insertamos los tres ltimos movimientos de la cuenta
INSERT INTO @datos
Bases de Datos II Ingeniera Informtica - UNT


Docente: Ing. Arturo Daz Pulido.
(Saldo_anterior, Saldo_posterior,
Importe_Movimiento, FxMovimiento )
SELECT TOP 3
SALDO_ANTERIOR, SALDO_POSTERIOR,
IMPORTE, FXMOVIMIENTO
FROM MOVIMIENTOS
WHERE IDCUENTA = @idcuenta
ORDER BY FXMOVIMIENTO DESC
-- Vamos a la siguiente cuenta
FETCH CDATOS INTO @idcuenta, @numcuenta, @saldo
END

CLOSE CDATOS;
DEALLOCATE CDATOS;

RETURN
END
Para ejecutar la funcin:

select * from fn_CuentaMovimietos()
Y el resultado obtenido ...
NumCuenta Saldo Saldo_anterior Saldo_posterior Importe_Movimiento FxMovimiento
------------ ------ --------------- ---------------- ------------------- -----------------------
200700000002 500.00 NULL NULL NULL NULL
NULL NULL 550.00 500.00 50.00 2007-08-25 16:18:36.490
NULL NULL 600.00 550.00 50.00 2007-08-23 16:20:41.183
NULL NULL 600.00 550.00 50.00 2007-08-23 16:14:05.900
200700000001 100.99 NULL NULL NULL NULL
NULL NULL 50.99 100.99 50.00 2007-08-25 16:18:36.490
NULL NULL 0.99 50.99 50.00 2007-08-23 16:20:41.183
NULL NULL 50.99 0.99 50.00 2007-08-23 16:16:29.840

Bases de Datos II Ingeniera Informtica - UNT


Docente: Ing. Arturo Daz Pulido.
PRACTICA GUIADA:
Use northwind
go

1.Creacion de Funciones Escalares
CREATE FUNCTION Igv (@DATE money)
RETURNS money
AS
BEGIN
Declare @igv money
Set @Igv=@date*.18
Return(@igv)
END

3.Revisar la funcion debe de escribirse el nombre
con dos partes
Select unitprice, dbo.igv(unitprice) as igv
from [order details]

4.borrar la funcion
drop function igv

5.Otro ejemplo de funcion

CREATE Function Comision(@valor money)
ReturnS money
as
Begin
Declare @Resultado money
if @valor>=15
BEGIN
SET @RESULTADO= @VALOR * 1.10
END
ELSE
BEGIN
SET @RESULTADO=@VALOR
END
RETURN @RESULTADO
END

ejecutar la funcion
Bases de Datos II Ingeniera Informtica - UNT


Docente: Ing. Arturo Daz Pulido.

SELECT UNITPRICE, DBO.Comision(UNITPRICE) FROM[ORDER
DETAILS]


/* en una funcion no se pueden usar estas funciones
no determiniestas
@@ERROR FORMATMESSAGE IDENTITY USER_NAME
@@IDENTITY GETANSINULL NEWID @@ERROR
@@ROWCOUNT GETDATE PERMISSIONS @@IDENTITY
@@TRANCOUNT GetUTCDate SESSION_USER @@ROWCOUNT
APP_NAME HOST_ID STATS_DATE @@TRANCOUNT
CURRENT_TIMESTAMP HOST_NAME SYSTEM_USER
CURRENT_USER IDENT_INCR TEXTPTR
DATENAME IDENT_SEED TEXTVALID
*/

6.Una funcin con valores de tabla de varias
instrucciones es una combinacin de una vista y un
procedimiento almacenado.


CREATE FUNCTION LISTAPORPAIS(@PAIS VARCHAR(50))
RETURNS @CLIENTES TABLE
(
CUSTOMERID VARCHAR(10), COMPANYNAMEVARCHAR(50),CONTA
CTNAME VARCHAR(50) ,COUNTRYVARCHAR(50)
)
AS
BEGIN
INSERT @CLIENTES SELECTCUSTOMERID,COMPANYNAME,CONTAC
TNAME,COUNTRY FROMCUSTOMERS
WHERE COUNTRY=@PAIS
RETURN
END

7.EJECUCION DE FUNCION
SELECT * FROM LISTAPORPAIS(GERMANY)

8.Ejemplo de una funcin con valores de tabla en
lnea

Bases de Datos II Ingeniera Informtica - UNT


Docente: Ing. Arturo Daz Pulido.
CREATE FUNCTION DETALLEPEDIDO_FECHA(@INICIODATETIME,
@FIN DATETIME)
RETURNS TABLE
AS
RETURN
(
SELECT O.ORDERID,O.ORDERDATE,P.PRODUCTID,P.PRODUCTNA
ME,(OD.UNITPRICE * OD.QUANTITY) ASTOTAL
FROM ORDERS AS O INNER JOIN [ORDER DETAILS] ASOD
ON O.ORDERID=OD.ORDERID INNER JOIN PRODUCTS ASP
ON OD.PRODUCTID=P.PRODUCTID
WHERE O.ORDERDATE BETWEEN @INICIO AND @FIN
)

Ejecutar la funcion

SELECT * FROM DBO.DETALLEPEDIDO_FECHA(1998-01-
01,1998-31-12)

Anda mungkin juga menyukai