Академический Документы
Профессиональный Документы
Культура Документы
PRCTICA ORACLE)
OBJETIVO
08
(Base
de
Datos
Relacional
Funciones
Existen en SQL muchas funciones que pueden complementar el manejo de los datos en las consultas. Se utilizan dentro de las expresiones y actuan con los valores de las columnas, variables o constantes. Se pueden incluir en las clsulas SELECT, WHERE y ORDER BY. Pueden anidarse funciones dentro de funciones. Y existe una gran variedad de funciones para cada tipo de datos: aritmticas, de cadenas de caracteres, de manejo de fechas, de conversin, otras, de grupo.
Las funciones matemticas realizan operaciones con expresiones numricas y retornan un resultado, operan con tipos de datos numricos. Las funciones numricas aceptan parmetros de entrada de tipo numrico y retornan valores numricos. Oracle tiene algunas funciones para trabajar con nmeros. Aqu presentamos algunas. - abs(x): retorna el valor absoluto del argumento "x". Ejemplo: select abs(-20) from dual;--retorna 20. La tabla dual es una tabla virtual que existe en todas las Bases de datos Oracle. - ceil(x): redondea a entero, hacia arriba, el argumento "x". Ejemplo: select ceil(12.34) from dual;--retorna 13. - floor(x): redondea a entero, hacia abajo, el argumento "x". Ejemplo: select floor(12.34) from dual; --12 - mod(x,y): devuelve el resto de la divisin x/y. Ejemplos: select mod(10,3) from dual;--retorna 1. select mod(10,2) from dual;--retorna 0. - power(x,y): retorna el valor de "x" elevado a la "y" potencia. Ejemplo: select power(2,3) from dual;--retorna 8. - round(n,d): retorna "n" redondeado a "d" decimales; si se omite el segundo argumento, redondea todos los decimales. Si el segundo argumento es positivo, el nmero de decimales es redondeado segn "d"; si es negativo, el nmero es redondeado desde la parte entera segn el valor de "d". Ejemplos: select select select select select round(123.456,2) from dual;-- retorna "123.46", es decir, redondea desde el segundo decimal. round(123.456,1) from dual;-- 123.5, es decir, redondea desde el primer decimal. round(123.456,-1) from dual;-- 120, redondea desde el primer valor entero (hacia la izquierda). round(123.456,-2) from dual;-- 100, redondea desde el segundo valor entero (hacia la izquierda). round(123.456) from dual;-- 123.
- sign(x): si el argumento es un valor positivo, retorna 1, si es negativo, devuelve -1 y 0 si es 0. Ejemplo: select sign(-120) from dual;--retorna -1 select sign(120) from dual;--retorna 1 - trunc(n,d): trunca un nmero a la cantidad de decimales especificada por el segundo argumento. Si se omite el segundo argumento, se truncan todos los decimales. Si "d" es negativo, el nmero es truncado desde la parte entera. Ejemplo:
- sqrt(x): devuelve la raiz cuadrada del valor enviado como argumento. Ejemplo: select sqrt(9) from dual;--retorna 3 Oracle dispone de funciones trigonomtricas que retornan radianes, calculan seno, coseno, inversas, etc.: acos, asin, atan, atan2, cos, cosh, exp, ln, log, sin, sinh, tan, tanh. No las veremos en detalle. Se pueden emplear las funciones matemticas enviando como argumento el nombre de un campo de tipo numrico.
Resultado 15 16
Calcula el valor entero inmediatamente superior o select ceil(15.7) from dual; igual a n. Calcula el valor entero inmediatamante inferior o select floor(15.7) from dual; igual a n. Calcula el resto resultante de dividir m entre n. Calcula la potencia n-esima de m. select mod(11,4) from dual; select power(3,2) from dual; round(123.456,1) from
15 3 9
ROUND(m,n)
Calcula el redondeo de m a n decimales. Si n<0 el select redondeo se efectua a por la izquierda del punto dual; decimal. Calcula la raz cuadrada de n.
123.5
SQRT(n) TRUNC(m,n)
2 123.4
SIGN(n)
Calcula el signo de n, devolviendo -1 si n<0, 0 si select sign(-12) from dual; n=0 y 1 si n>0.
-1
Eliminamos la tabla: drop table empleados; Creamos la tabla: create table empleados( legajo number(5), documento char(8) not null, nombre varchar2(30) not null, domicilio varchar2(30), sueldo number(6,2), hijos number(2), primary key (legajo) ); Ingresamos algunos registros: insert into empleados values(1,'22333444','Ana Acosta','Avellaneda 213',870.79,2); insert into empleados values(20,'27888999','Betina Bustos','Bulnes 345',950.85,1); insert into empleados values(31,'30111222','Carlos Caseres','Caseros 985',1190,0); insert into empleados values(39,'33444555','Daniel Duarte','Dominicana 345',1250.56,3); Vamos a mostrar los sueldos de los empleados redondeando el valor hacia abajo y luego hacia arriba (empleamos "floor" y "ceil"): select floor(sueldo) as "sueldo hacia abajo", ceil(sueldo) as "sueldo hacia arriba" from empleados; Mostramos los nombre de cada empleado, su respectivo sueldo, y el sueldo redondeando el valor a entero ("round") y truncado a entero ("trunc"): select nombre, sueldo, round(sueldo) as "sueldo redondeado", trunc(sueldo) as "sueldo truncado" from empleados; Note que los valores devueltos segn la funcin empleada, son diferentes. Mostramos el resultado de "2 elevado a la potencia 5" ("power"): select power(2,5) from dual; Retorna el valor 32. Mostramos el resto de la divisin "1234 / 5" ("mod"): select mod(1234,5) from dual; Devuelve el valor 4. Calculamos la raz cuadrada de 81: select sqrt(81) from dual; Retorna 9.
Las funciones de manejo de caracteres alfanumricos aceptan argumentos de tipo caracter y retornan caracteres o valores numricos. Las siguientes son algunas de las funciones que ofrece Oracle para trabajar con cadenas de caracteres: - chr(x): retorna un caracter equivalente al cdigo enviado como argumento "x". Ejemplo: select chr(65) from dual;-- retorna 'A'. select chr(100) from dual;-- retorna 'd'. - concat(cadena1,cadena2): concatena dos cadenas de caracteres; es equivalente al operador ||. Ejemplo: select concat('Buenas',' tardes') from dual;--retorna 'Buenas tardes'. - initcap(cadena): retorna la cadena enviada como argumento con la primera letra (letra capital) de cada palabra en mayscula. Ejemplo: select initcap('buenas tardes alumno') from dual;--retorna 'Buenas Tardes Alumno'. - lower(cadena): retorna la cadena enviada como argumento en minsculas. "lower" significa reducir en ingls. Ejemplo: select lower('Buenas tardes ALUMNO') from dual;--retorna "buenas tardes alumno". - upper(cadena): retorna la cadena con todos los caracteres en maysculas. Ejemplo: select upper('www.oracle.com') from dual;-- 'WWW.ORACLE.COM' - lpad(cadena,longitud,cadenarelleno): retorna la cantidad de caracteres especificados por el argumento "longitud", de la cadena enviada como primer argumento (comenzando desde el primer caracter); si "longitud" es mayor que el tamao de la cadena enviada, rellena los espacios restantes con la cadena enviada como tercer argumento (en caso de omitir el tercer argumento rellena con espacios); el relleno comienza desde la izquierda. Ejemplos: select lpad('alumno',10,'xyz') from dual;-- retorna 'xyzxalumno' select lpad('alumno',4,'xyz') from dual;-- retorna 'alum' - rpad(cadena,longitud,cadenarelleno): retorna la cantidad de caracteres especificados por el argumento "longitud", de la cadena enviada como primer argumento (comenzando desde el primer caracter); si "longitud" es mayor que el tamao de la cadena enviada, rellena los espacios restantes con la cadena enviada como tercer argumento (en caso de omitir el tercer argumento rellena con espacios); el relleno comienza desde la derecha (ltimo caracter). Ejemplos: select rpad('alumno',10,'xyz') from dual;-- retorna 'alumnoxyzx' select rpad('alumno',4,'xyz') from dual;-- retorna 'alum' - ltrim(cadena1,cadena2): borra todas las ocurrencias de "cadena2" en "cadena1", si se encuentran al comienzo; si se omite el segundo argumento, se eliminan los espacios. Ejemplo: select ltrim('la casa de la cuadra','la') from dual;-- ' casa de la cuadra'
- replace(cadena,subcade1,subcade2): retorna la cadena con todas las ocurrencias de la subcadena de reemplazo (subcade2) por la subcadena a reemplazar (subcae1). Ejemplo: select replace('xxx.oracle.com','x','w') from dual; retorna "www.oracle.com'. - substr(cadena,inicio,longitud): devuelve una parte de la cadena especificada como primer argumento, empezando desde la posicin especificada por el segundo argumento y de tantos caracteres de longitud como indica el tercer argumento. Ejemplo: select substr('www.oracle.com',1,10) from dual;-- 'www.oracle' select substr('www.oracle.com',5,6) from dual;-- 'oracle' - length(cadena): retorna la longitud de la cadena enviada como argumento. "lenght" significa longitud en ingls. Ejemplo: select length('www.oracle.com') from dual;-- devuelve 14. - instr (cadena,subcadena): devuelve la posicin de comienzo (de la primera ocurrencia) de la subcadena especificada en la cadena enviada como primer argumento. Si no la encuentra retorna 0. Ejemplos: select instr('Jorge Luis Borges','or') from dual;-- 2 select instr('Jorge Luis Borges','ar') from dual;-- 0, no se encuentra - translate(): reemplaza cada ocurrencia de una serie de caracteres con otra serie de acracteres. La diferencia con "replace" es que aquella trabaja con cadenas de caracteres y reemplaza una cadena completa por otra, en cambio "translate" trabaja con caracteres simples y reemplaza varios. En el siguiente ejemplo se especifica que se reemplacen todos los caracteres "O" por el caracter "0", todos los caracteres "S" por el caracter "5" y todos los caracteres "G" por "6": select translate('JORGE LUIS BORGES','OSG','056') from dual;--'J0R6E LUI5 B0R6E5' Se pueden emplear estas funciones enviando como argumento el nombre de un campo de tipo caracter.
CONCAT(cad1,cad2)
Devuelve cad1 concatenada con cad2. select concat(concat(nombre,' Cano es Esta funcin es esquivalente al operador es '),oficio) from emp; Presidente, etc. ||. Devuelve la cadena cad con todas sus select lower('MinUsCulAs') from letras convertidas a minsculas. dual; Devuelve la cadena cad con todas sus select upper('maYuSCulAs') letras convertidas a maysculas. from dual; Devuelve cad con el primer caracter en select initcap('isabel') from dual; maysculas. Devuelve cad1 con longitud n, y ajustada a la derecha, rellenando por la select lpad('P',5,'*') from dual; izquierda con cad2. Devuelve cad1 con longitud n, y ajustada a la izquierda, rellenando por select rpad('P',5,'*') from dual; la derecha con cad2. minusculas
LOWER(cad)
UPPER(cad)
MAYUSCULAS
INITCAP(cad)
Isabel
LPAD(cad1,n,cad2)
****P
RPAD(cad1,n,cad2)
P****
Devuelve cad en la que cada ocurrencia select replace('digo','i','ie') from REPLACE(cad,ant,nue) de la cadena ant ha sido sustituida por dual; la cadena nue. Devuelve la sudcadena de cad select substr('ABCDEFG',3,2) compuesta por n caracteres a partir de from dual; la posicion m. Devuelve la longitud de cad. select dual; length('cadena') from
diego
SUBSTR(cad,m,n)
CD
LENGTH(cad)
Mostramos slo los 12 primeros caracteres de los ttulos de los libros y sus autores, empleando la funcin "substr": select substr(titulo,1,12) as titulo from libros; Mostramos slo los 20 primeros caracteres de los ttulos de los libros y rellenando los espacios restantes con "*", empleando la funcin "rpad": select rpad(titulo,20,'*') as titulo from libros; Mostramos los ttulos de los libros empleando la funcin "initcap": select initcap(titulo) as titulo from libros; Note que cada palabra comienza con maysculas. Mostramos los ttulos de los libros y sus autores en maysculas: select titulo,upper(autor) as autor from libros; Concatenamos ttulo y autor empleando "concat": select concat(titulo, autor)
Mostramos el ttulo y el precio de todos los libros concatenando el signo "$" a los precios: select titulo,concat('$ ',precio) as precio from libros; Recuperamos el ttulo y editorial de "libros" reemplazando "Emece" por "Sudamericana": select titulo,replace(editorial,'Emece','Sudamericana') from libros; Recuperamos el autor de todos los libros reemplazando las letras "abc" por "ABC" respectivamente (empleando "translate"): select translate(autor,'abc','ABC') from libros; Note que cada caracter individual es reemplazado por el especificado. Mostramos la posicin de la primera ocurrencia de la cadena "pais" en los ttulos de los libros: select instr(titulo,'pais') from libros; Note que los ttulos que no contienen la subcadena "pais" muestran el valor cero.
Oracle dispone de varias funciones que operan con tipos de datos "date". Estas son algunas: - add_months(f,n): agrega a una fecha, un nmero de meses. Si el segundo argumento es positivo, se le suma a la fecha enviada tal cantidad de meses; si es negativo, se le resta a la fecha enviada tal cantidad de meses. Ejemplo: select add_months('10/06/2007',5) from dual; --retorna "10/11/07" select add_months('10/06/2007',-5) from dual; --retorna "10/01/07" select add_months('30/01/2007',1) from dual;-- retorna "25/02/07" ya que es el ltimo da de ese mes. - last_day(f): retorna el ultimo da de mes de la fecha enviada como argumento. Ejemplo: select last_day('10/02/2007') from dual;-- "28/02/07" select last_day('10/08/2007') from dual;-- "31/08/07" - months_between(f1,f2): retorna el numero de meses entre las fechas enviadas como argumento. Ejemplo: select months_between('19/05/2003','21/06/05') from dual;-- retorna - next_day(fecha,dia): retorna una fecha correspondiente al primer da especificado en "dia" luego de la fecha especificada. En el siguiente ejemplo se busca el lunes siguiente a la fecha especificada: select next_day('10/08/2007','LUNES') from dual; - current_date: retorna la fecha actual. Ejemplo: select current_date from dual; - current_timestamp: retorna la fecha actual select current_timestamp from dual; Retorna: 10/08/07 09:59:44,109000000 AMERICA/BUENOS_AIRES - sysdate: retorna la fecha y hora actuales en el servidor de Oracle. -systimestamp: retorna fecha y hora actuales. select systimestamp from dual; Retorna 10/08/07 10:33:48,984000000 -03:00 - to_date: convierte una cadena a tipo de dato "date". Ejemplo: select to_date ('05-SEP-2007 10:00 AM','DD-MON-YYYY HH:MI AM') from dual; Retorna 05/09/07 - to_char: convierte una fecha a cadena de caracteres. Ejemplo:
10
ADD_MONTHS(d,n)
14-JUL-97
LAST_DAY(d)
Devuelve la fecha del ltimo da select last_day(sysdate) from del mes de d. dual; select Devuelve la diferencia en meses months_between(sysdate,'01entre las fechas d1 y d2. JAN-97') from dual; Devuelve la fecha del primer da select next_day(sysdate, de la semana cad despus de la 'sunday') from dual; fecha d.
31-MAR-97
MONTHS_BETWEEN(d1, d2)
2.43409424
NEXT_DAY(d,cad)
16-MAR-97
11
Convierte la cadena cad a un nmero, select to_number('12345') from TO_NUMBER(cad,fmto) opcionalmente de acuerdo con el 124345 dual; formato fmto. Convierte la fecha d a una cadena de caracteres, opcionalmente de acuerdo select to_char(sysdate) from dual; '14-MAR-97' con el formato fmto. Convierte la cadena cad de tipo select varchar2 a fecha, opcionalmente de dual; acuerdo con el formato fmto. to_date('1-JAN-97') from
TO_CHAR(d, fmto)
TO_DATE(cad,fmto)
01-JAN-97
Con las fechas pueden utilizarse varios formatos. Estos formatos permiten modificar la presentacin de una fecha. En la siguiente tabla se presentan algunos formatos de fecha y el resultado que generan.
yyyy yyy yy Ao sin signo con cuatro, tres, dos o select to_char(sysdate,'yyyy') from dual; 1997 y un dgitos. q ww w mm ddd dd d hh hh24 mi ss sssss hh12 Trimestre. select to_char(sysdate,'q') from dual; 1 11 03 073
Nmero de la semana del ao o del select to_char(sysdate,'ww') from dual; mes. Nmero del mes. select to_char(sysdate,'mm') from dual;
Nmero del da del ao, del mes o de select to_char(sysdate,'ddd') from dual; la semana. La hora en formato 12h. o 24h. Los minutos de la hora. select to_char(sysdate,'hh') from dual; select to_char(sysdate,'mi') from dual;
12 15
Los segundos dentro del minuto, o select to_char(sysdate,'sssss') from dual; 44159 desde las 0 horas.
12
Ejemplo
Resultado
month o mon
Nombre del mes o su abreviatura de select to_char(sysdate,'month') march tres letras. from dual; Nombre del da de la semana o su select to_char(sysdate,'day') from friday abreviatura de tres letras. dual; El espacio del da. select to_char(sysdate,'a.m.') from p.m. dual; a.d.
day dy
a.m. p.m.
b.c. a.d.
Indicador del ao respecto al del select to_char(sysdate,'b.c.') nacimiento de Cristo. from dual;
Otras Funciones
Funcin Cometido Ejemplo Resultado
Convierte el valor de var, DECODE(var, val1, cod1, val2, select decode(oficio, 'Presidente', 'P', de acuerdo con la P, D, X, ... cod2, ..., defecto) 'Director', 'D', 'X') from emp; codificacin. GREATEST(exp1, exp2, ...) Devuelve el mayor valor sin ejemplo. de una lista. Devuelve el menor valor sin ejemplo. de una lista. sin ejemplo.
LEAST(cad,fmto)
sin ejemplo.
NVL(val, exp)
Devuelve la expresin select salario+nvl(comision,0) from 450000, exp si val es NULL, y val emp; 350000, ... si en otro caso.
13
Mostramos el ttulo del libro y el ao de edicin: select titulo, extract (year from edicion) from libros; Mostramos el ttulo del libro y el mes de edicin: select titulo, extract (month from edicion) from libros; Mostramos el ttulo del libro y los aos que tienen de editados: select titulo, extract(year from sysdate)-extract(year from edicion) as "aos de editado" from libros; Mostramos los ttulos de los libros que se editaron en el ao 2000: select titulo from libros where extract(year from edicion)=2000; Calcule 3 meses luego de la fecha actual empleando ""add_months": select add_months(sysdate,3) from dual; Muestre la fecha del primer martes desde la fecha actual: select next_day(sysdate,'martes') from dual; Muestre la fecha que ser 15 das despus de "24/08/2007" empleando el operador "+": select to_date('24/08/2007')+15 from dual; Retorna 08/09/07. Muestre la fecha que 20 das antes del "12/08/2007" empleando el operador "-": select to_date('12/08/2007')-20 from dual; Retorna 23/07/07.
14
15
16