0 évaluation0% ont trouvé ce document utile (0 vote)
190 vues17 pages
Este documento describe diferentes tipos de funciones en SQL, incluyendo funciones a nivel de fila y de múltiples filas, funciones de caracteres, números y fechas. Explica cómo usar funciones como CONCAT, SUBSTR, ROUND, TRUNC, ADD_MONTHS y DECODE. También cubre temas como formatos de fecha, conversión de tipos de datos y creación de funciones escalares en Transact SQL.
Este documento describe diferentes tipos de funciones en SQL, incluyendo funciones a nivel de fila y de múltiples filas, funciones de caracteres, números y fechas. Explica cómo usar funciones como CONCAT, SUBSTR, ROUND, TRUNC, ADD_MONTHS y DECODE. También cubre temas como formatos de fecha, conversión de tipos de datos y creación de funciones escalares en Transact SQL.
Este documento describe diferentes tipos de funciones en SQL, incluyendo funciones a nivel de fila y de múltiples filas, funciones de caracteres, números y fechas. Explica cómo usar funciones como CONCAT, SUBSTR, ROUND, TRUNC, ADD_MONTHS y DECODE. También cubre temas como formatos de fecha, conversión de tipos de datos y creación de funciones escalares en Transact SQL.
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
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
/* 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)