Está en la página 1de 17

Bases de Datos II

Ingeniera Informtica - UNT

FUNCIONES EN SQL
Existen dos tipos de funciones:
o

Funciones a nivel de fila

Funciones a nivel de mltiples filas

Funciones a nivel de fila. Tipos:


o

Carcter

Nmero

Fecha

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

Funciones de manipulacin de caracteres

De manipulacin de caracteres:
o

CONCAT

SUBSTR

LENGTH

INSTR

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.

Docente: Ing. Arturo Daz Pulido.

Bases de Datos II

Ingeniera Informtica - UNT

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,
FROM SYS.DUAL;

2),

ROUND(45.923,

0),

ROUND(45.923,

-1)

TRUNC(45.923,

-1)

Resultado: 45.92 46 50
SQL>

SELECT TRUNC(45.923,
FROM SYS.DUAL;

2),

TRUNC(45,923),

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

Docente: Ing. Arturo Daz Pulido.

Bases de Datos II

Ingeniera Informtica - UNT

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

Docente: Ing. Arturo Daz Pulido.

Bases de Datos II

Ingeniera Informtica - UNT

MONTS_BETWEEN (01-SEP-95, 11-JAN-94)


ADD_MONTHS(11-JAN-94, 6)

11-JUL-94

NEXT_DAY (01-SEP-95, FRIDAY)


LAST_DAY (01-SEP-95)

19.6774194

08-SEP-95

30-SEP-95

ROUND (25-JUL-95, MONTH)


ROUND (25-JUL-95, YEAR)

01-AUG-95
01-JAN-96

TRUNC (25-JUL-95, MONTH)


TRUNC (25-JUL-95, YEAR)

01-JUL-95
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

MI / SS / SSSS

Indicador del Meridiano

Sufijo SP / SPTH o THSP

Minutos / Segundos / Segundos despus de medianoche

AM o PM

Hora del da / Hora (1-12) / Hora (1-24)

Deletreo del nmero / Deletreo nmeros ordinales

Se permiten literales

Funciones de conversin (I)

Docente: Ing. Arturo Daz Pulido.

Bases de Datos II

Ingeniera Informtica - UNT

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

De DATE

a VARCHAR2
a VARCHAR2

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).

Docente: Ing. Arturo Daz Pulido.

Bases de Datos II

Ingeniera Informtica - UNT

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

Docente: Ing. Arturo Daz Pulido.

Bases de Datos II

Ingeniera Informtica - UNT

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),

Docente: Ing. Arturo Daz Pulido.

Bases de Datos II

Ingeniera Informtica - UNT

@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,

Docente: Ing. Arturo Daz Pulido.

Bases de Datos II

Ingeniera Informtica - UNT

-- 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

Docente: Ing. Arturo Daz Pulido.

Bases de Datos II

Ingeniera Informtica - UNT

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')

Docente: Ing. Arturo Daz Pulido.

Bases de Datos II

Ingeniera Informtica - UNT

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>

Docente: Ing. Arturo Daz Pulido.

Bases de Datos II

Ingeniera Informtica - UNT

) 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

Docente: Ing. Arturo Daz Pulido.

Bases de Datos II

Ingeniera Informtica - UNT

-- 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

Docente: Ing. Arturo Daz Pulido.

Bases de Datos II

Ingeniera Informtica - UNT

(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
-----------200700000002
NULL
NULL
NULL
200700000001
NULL
NULL
NULL

Saldo
-----500.00
NULL
NULL
NULL
100.99
NULL
NULL
NULL

Saldo_anterior
--------------NULL
550.00
600.00
600.00
NULL
50.99
0.99
50.99

Saldo_posterior
---------------NULL
500.00
550.00
550.00
NULL
100.99
50.99
0.99

Importe_Movimiento
------------------NULL
50.00
50.00
50.00
NULL
50.00
50.00
50.00

FxMovimiento
----------------------NULL
2007-08-25 16:18:36.490
2007-08-23 16:20:41.183
2007-08-23 16:14:05.900
NULL
2007-08-25 16:18:36.490
2007-08-23 16:20:41.183
2007-08-23 16:16:29.840

Docente: Ing. Arturo Daz Pulido.

Bases de Datos II

Ingeniera Informtica - UNT

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

Docente: Ing. Arturo Daz Pulido.

Bases de Datos II

Ingeniera Informtica - UNT

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

Docente: Ing. Arturo Daz Pulido.

Bases de Datos II

Ingeniera Informtica - UNT

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-0101,1998-31-12)

Docente: Ing. Arturo Daz Pulido.

También podría gustarte