Mostrando entradas con la etiqueta SQL. Mostrar todas las entradas
Mostrando entradas con la etiqueta SQL. Mostrar todas las entradas

jueves, 26 de diciembre de 2013

DB2 - Sequences

Seguramente todos conocemos la posibilidad de definir una columna de una tabla con IDENTITY, para que de esa forma se nos autogeneren valores y no tengamos que preocuparnos de realizar el típico SELECT MAX. Otro método un poco más desconocido para realizar esto son las SEQUENCES.

Una SEQUENCE es un objeto almacenado que permite generar una secuencia de números en forma ascendente o descendente. Aunque hay similitudes con una columna IDENTITY, la principal diferencia es que mientras la columna IDENTITY se define dentro del ámbito de una tabla, una SEQUENCE no está ligada a una sola tabla, por lo que puede ser usada desde varias. Esto permite usar la SEQUENCE para generar una clave primaria y coordinarla entre registros de distintas tablas.

Las principales características de una secuencia son:
  • Garantiza valores únicos.
  • Genera valores de forma creciente o decreciente dentro de un rango.
  • Puede incrementar valores en más de 1 unidad
  • Si se produce un error en DB2 la secuencia se reconstruye a partir del log, lo que garantiza que se seguirán generando correctamente los valores tras un fallo.

 Aquí va un ejemplo de cómo crear una secuencia:

CREATE SEQUENCE EJEMPLO_SEQ
       START WITH 1
       INCREMENT BY 1

Indicamos que deseamos crear la secuencia EJEMPLO_SEQ que comenzará en 1 y se incrementará en una unidad.

Ahora, suponiendo que la secuencia no se ha usado todavía, vamos a generar el primer valor y lo usaremos para insertar en la columna ID de la tabla EJEMPLO_TAB1. Tenemos dos opciones, generar el valor en el INSERT o generar el primer valor en una variable y luego utilizarlo en el INSERT.

Ejemplo de generarlo directamente en el INSERT:

INSERT INTO EJEMPLO_TAB1 (ID, NOMBRE)
VALUES (NEXT VALUE FOR EJEMPLO_SEQ, 'LOBOC');

Ejemplo de generar el valor sobre una variable y luego usarla en el INSERT:

SELECT NEXT VALUE FOR EJEMPLO_SEQ INTO :VAR_SEQ;

INSERT INTO EJEMPLO_TAB1 (ID, NOMBRE)
VALUES (:VAR_SEQ, 'LOBOC');

Cuando generamos un valor para una secuencia con NEXT VALUE (aunque este se realice en un SELECT) ese valor es consumido, y la próxima vez que se solicite un valor se generará uno nuevo. Esto ocurre incluso cuando se produce un fallo en la sentencia que contiene el NEXT VALUE o cuando se realiza rollback.

Justamente una de las potencias de las secuencias, el que garanticen que un NEXT VALUE siempre genera un nuevo valor bajo cualquier circunstancia podría llegar a ser un inconveniente. Por ejemplo, imaginemos que en un proceso batch generamos un fichero de LOAD donde para cada registro generamos un valor con NEXT VALUE. Si el fichero tiene 100.000 registros, habremos incrementado la secuencia en 100.000. Luego por cualquier problema o error, ese fichero de LOAD no se llega a cargar y se descarta. Esos 100.000 valores ya se habrán consumido y se habrán quedado huérfanos. En ciertos casos, donde sea importante que los números sean correlativos y no existan "huecos" (ej: numeración de las facturas) o donde tengamos el ID bastante ajustado en tamaño y no queremos que se nos consuman más valores de los estrictamente necesarios, quizás el uso de SEQUENCES no sea lo más recomendado.

Para profundizar más en el tema de las SEQUENCES os remitimos al  SQL Reference (SC19-2983-03) de IBM

NOTA: Para conocer las secuencias que ya están definidas podemos usar la siguiente consulta:

SELECT * FROM SYSIBM.SYSSEQUENCES

Fuente: SQL Reference (SC19-2983-03) IBM

viernes, 17 de mayo de 2013

DB2 - Funciones escalares para fechas

Las funciones escalares se aplican a valores únicos de entrada, y devuelven un resultado de valor único.

Aquí veremos las funciones que nos proporciona DB2 para manejar fechas.

DATE: La función DATE devuelve una fecha que se deriva de un valor.

 

Ej:  Obtenemos un date del string '2013-01-01'

SELECT DATE('2013-01-01')   
FROM SYSIBM.SYSDUMMY1;       


COL1          
----------    
2013-01-01      


TO_DATE: La función TO_DATE devuelve un valor de timestamp que se basa en la interpretación del string de entrada utilizando el formato especificado.

 

 Ej: Obtenemos un TIMESTAMP a partir de una fecha en formato de 8.


SELECT TO_DATE('20130101','YYYYMMDD')    
FROM SYSIBM.SYSDUMMY1;         


COL1                        
--------------------------  
2013-01-01-00.00.00.000000               


 
YEAR: La función YEAR devuelve la parte del año de un valor. El valor debe ser un string válido de una fecha o timestamp.



Ej: Obtenemos el año del string '2013-01-01'

SELECT YEAR('2013-01-01')
FROM SYSIBM.SYSDUMMY1;    


       COL1
-----------
       2013


MONTH: La función MONTH devuelve la parte del mes de un valor. El valor debe ser un string válido de una fecha o timestamp.

 

Ej: Obtenemos el mes del string '2013-02-01'

SELECT MONTH('2013-02-01')
FROM SYSIBM.SYSDUMMY1;    


       COL1
-----------
          2


ADD_MONTHS: La función ADD_MONTHS devuelve una fecha resultado de sumar un número de meses a la fecha pasada como argumento. 



Ej: Sumamos 12 meses a la fecha '2013-02-01'

SELECT ADD_MONTHS('2013-02-01', 12)  
FROM SYSIBM.SYSDUMMY1;  
                         

COL1     
----------
2014-02-01

MONTHS_BETWEEN: La función MONTHS_BETWEEN devuelve el número estimado de meses entre dos fechas pasadas como argumento.



Ej: Vemos los meses que hay entre '2013-02-01' y 2014-02-01'

SELECT MONTHS_BETWEEN('2013-02-01','2014-02-01')
FROM SYSIBM.SYSDUMMY1;                          
               

                              COL1
----------------------------------
               -12.000000000000000

WEEK: La función WEEK devuelve un número entero comprendido entre 1 y 54 que representa la semana del año. Para el cómputo de una semana se comienza en Domingo.



Ej: Vemos que semana corresponde con la fecha '2012-01-01'

SELECT WEEK('2012-01-01')
FROM SYSIBM.SYSDUMMY1;           

                                   
       COL1
-----------
          1

WEEK_ISO: La función WEEK_ISO devuelve un número entero comprendido entre 1 y 53 que representa la semana del año. Para el cómputo de una semana se comienza en Lunes e incluye los 7 días.



Ej: Vemos que semana corresponde con la fecha '2012-01-01'

SELECT WEEK_ISO('2012-01-01')
FROM SYSIBM.SYSDUMMY1;          

                                   
       COL1
-----------
         52

DAY: La función DAY devuelve la parte del día de un valor. El valor debe ser un string válido de una fecha o timestamp, o bien un númerico que represente una fecha o timestamp.



Ej: Vemos que día corresponde con la fecha '2012-02-01'

SELECT DAY('2012-02-01')
FROM SYSIBM.SYSDUMMY1;          

                                   
       COL1
-----------
          1

DAYOFMONTH: La función DAYOFMONTH devuelve la parte del día de un valor. El valor debe ser un string válido de una fecha o timestamp.


 
Ej: Vemos que día del mes corresponde con la fecha '2012-02-01'

SELECT DAYOFMONTH('2012-02-01')
FROM SYSIBM.SYSDUMMY1;             

                                   
       COL1
-----------
          1

DAYOFWEEK: La función DAYOFWEEK devuelve un número entero del 1 al 7 que representa el día de la semana, tomando como día 1 el Domingo y 7 el Sábado.



Ej: Vemos que día de la semana corresponde con la fecha '2012-02-01'

SELECT DAYOFWEEK('2012-02-01')
FROM SYSIBM.SYSDUMMY1;                   

                                   
       COL1
-----------
          4

DAYOFWEEK_ISO: La función DAYOFWEEK_ISO devuelve un número entero del 1 al 7 que representa el día de la semana, tomando como día 1 el Lunes y 7 el Domingo.



Ej: Vemos que día de la semana corresponde con la fecha '2012-02-01'

SELECT DAYOFWEEK_ISO('2012-02-01')
FROM SYSIBM.SYSDUMMY1;                   

                                   
       COL1
-----------
          3

DAYOFYEAR: La función DAYOFYEAR devuelve un número entero del 1 al 366 que representa el día del año, tomando como día 1 el 1 de Enero.



Ej: Vemos que día del año corresponde con la fecha '2012-02-01'

SELECT DAYOFYEAR('2012-02-01')
FROM SYSIBM.SYSDUMMY1;                   

                                   
       COL1
-----------
         32

DAYS: La función DAYS devuelve un número entero que representa la fecha. El valor 1 respresenta el 1 del 1 de 0001.



Ej: Vemos que entero corresponde con la fecha '2012-02-01'

SELECT DAYS('2012-02-01')
FROM SYSIBM.SYSDUMMY1;                   

                                   
       COL1
-----------
     734534

JULIAN_DAY: La función JULIAN_DAY devuelve un número entero que representa el número de días desde el 1 de Enero de 4713 A.C.



Ej: Vemos que día juliano corresponde con la fecha '2012-02-01'

SELECT JULIAN_DAY('2012-02-01')
FROM SYSIBM.SYSDUMMY1;                   

                                   
       COL1
-----------
    2455959

LAST_DAY: La función LAST_DAY devuelve una fecha que representa el último día del mes pasado por argumento.



Ej: Vemos que fecha corresponde con el último día de la fecha '2012-02-01'

SELECT LAST_DAY('2012-02-01')
FROM SYSIBM.SYSDUMMY1;      

COL1     
----------
2012-02-29

NEXT_DAY: La función NEXT_DAY devuelve un timestamp que representa el siguiente día, al pasado por argumento, que se corresponde al día de la semana indicado por argumento.



Ej: Vemos que fecha se corresponde al siguiente Lunes a la fecha '2013-05-17'

SELECT NEXT_DAY('2013-05-17','MONDAY')
FROM SYSIBM.SYSDUMMY1;                 

COL1                    
--------------------------
2013-05-20-00.00.00.000000

Esperamos no dejarnos ninguna de las más habituales, de todas formas os recomendamos para profundizar en las funciones consultar el SQL Reference de IBM para DB2 10 z/OS.

Fuentes: SQL Reference (SC19-2983-03) IBM y Wikipedia

viernes, 22 de febrero de 2013

DB2 - Funciones escalares trigonométricas


Las funciones escalares se aplican a valores únicos de entrada, en lugar de a conjuntos de valores como las funciones agregadas, y devuelven un resultado de valor único.


Aquí veremos las funciones que nos proporciona DB2 para realizar cálculos trigonométricos (medición de los triángulos) . Haremos también una breve introducción a los conceptos básicos. (lo mismo ya los hemos reseteado :) )

Unidades angulares

En la medición de ángulos y, por tanto, en trigonometría, se emplean tres unidades, si bien la más utilizada en la vida cotidiana es el grado sexagesimal, en matemáticas es el radián la más utilizada, y se define como la unidad natural para medir ángulos, el grado centesimal se desarrolló como la unidad más próxima al sistema decimal, se usa en topografía, arquitectura o en construcción.
  • Radián: unidad angular natural en trigonometría, será la que aquí utilicemos. En una circunferencia completa hay 2π radianes. (π = 3,141592653...)
  • Grado sexagesimal: unidad angular que divide una circunferencia en 360 grados.
  • Grado centesimal: unidad angular que divide la circunferencia en 400 grados centesimales.

DEGREES: devuelve el número de grados sexagesimales del argumento, que es un ángulo, expresado en radianes.

 

Ej: Aplicamos la función a 2π = 6,283185306 aprox, que es la circunferencia completa, por lo que nos tiene que devolver 360 grados.

SELECT DEGREES(6.283185306)   
FROM SYSIBM.SYSDUMMY1;         


      COL1
----------
 3.600E+02

RADIANS: devuelve el número de radianes de un argumento que es expresada en grados sexagesimales.



Ej: Aplicamos la función a 360 grados, que es la circunferencia completa, por lo que nos tiene que devolver 2π = 6,283185306 radianes aprox.

SELECT RADIANS(360)  
FROM SYSIBM.SYSDUMMY1;


      COL1
----------
 6.283E+00

Funciones trigonométricas básicas


En geometría, se llama triángulo rectángulo a todo triángulo que posee un ángulo recto. El cateto es cualquiera de los dos lados menores de un triángulo rectángulo (los que conforman el ángulo recto) mientras que el lado mayor se denomina hipotenusa (el que es opuesto al ángulo recto).

El seno es la razón entre el cateto opuesto (a) sobre la hipotenusa (c).
El coseno es la razón entre el cateto adyacente (b) sobre la hipotenusa (c).
La tangente es la razón entre el cateto opuesto (a) sobre el cateto adyacente (b).




 

SIN: devuelve el seno del argumento, donde el argumento es un ángulo, expresado en radianes.



Ej: Aplicamos la función a 1/2π = 1,5707963265 radianes, que equivale a un ángulo de 90 grados, donde el seno es 1.

SELECT SIN(1.5707963265) 
FROM SYSIBM.SYSDUMMY1;     


      COL1
----------
 1.000E+00

ASIN: devuelve el arco seno del argumento como un ángulo, expresado en radianes. ASIN y SIN son operaciones inversas.



Ej: Aplicamos la función de forma inversa al anterior ejemplo:

SELECT ASIN(1)        
FROM SYSIBM.SYSDUMMY1;   


      COL1
----------
 1.571E+00 

COS: devuelve el coseno del argumento, donde el argumento es un ángulo, expresado en radianes. COS y ACOS son operaciones inversas.



Ej: Aplicamos la función a 0π = 0 radianes, que equivale a un ángulo de 0 grados, donde el coseno es 1.

SELECT COS(0)       
FROM SYSIBM.SYSDUMMY1;


      COL1
----------
 1.000E+00

ACOS: devuelve el arco coseno del argumento como un ángulo, expresado en radianes. ACOS y COS son operaciones inversas. 



Ej: Aplicamos la función de forma inversa al anterior ejemplo:

SELECT ACOS(1)        
FROM SYSIBM.SYSDUMMY1;   


      COL1
----------
 0.000E+00

TAN: devuelve la tangente del argumento, donde el argumento es un ángulo, expresado en radianes.


 

Ej: Aplicamos la función a 1/4π = 0,78539816325 radianes, que equivale a un ángulo de 45 grados, donde la tangente es 1.

SELECT TAN(0.78539816325)
FROM SYSIBM.SYSDUMMY1;    


      COL1
----------
 1.000E+00

ATAN: devuelve el arco tangente del argumento como un ángulo, expresado en radianes. TAN y ATAN son operaciones inversas.




Ej: Aplicamos la función de forma inversa al anterior ejemplo:

SELECT ATAN(1)       
FROM SYSIBM.SYSDUMMY1; 


      COL1
----------
 7.854E-01

 Otras funciones

ATAN2: devuelve el arco tangente de las coordenadas x e y como un ángulo, expresado en radianes.



SINH: devuelve el seno hiperbólico del argumento, donde el argumento es un ángulo expresado en radianes.



COSH: devuelve el coseno hiperbólico del argumento, donde el argumento es un ángulo expresado en radianes. 



TANH: devuelve la tangente hiperbólica del argumento, donde el argumento es un ángulo expresado en radianes.

 

ATANH: devuelve el arco tangente hiperbólica de un número, expresado en radianes. ATANH y TANH son operaciones inversas.



Fuentes: SQL Reference (SC19-2983-03) IBM y Wikipedia