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

miércoles, 18 de diciembre de 2013

Coboleros infelices

Según un estudio reciente del portal de empleo tecnológico ticjob.es entre 2.500 empleados, los profesionales que se dedican habitualmente a trabajar con las tecnologías Net, ERP, Business Intelligence y Oracle están más satisfechos que los que trabajan con la tecnología Cobol, Java/J2EE, C/C++ o HTML.

De este informe se arrojan datos optimistas, ya que el nivel de satisfacción entre profesionales del sector de las Tecnologías de la Información y la Comunicación (TIC) en España es bastante elevado, el 70% está contento con su actual empleo.

Baleares es la comunidad autónoma con el sueldo medio bruto anual más elevado, que se sitúa en 32.700 euros.

En la encuesta también se ha analizado el nivel de satisfacción en función del género y los resultados evidencian que las mujeres se encuentran más descontentas que los hombres.

Teniendo en cuenta que los expertos en Cobol son los profesionales mejor pagados del mercado, esto es una muestra más de que el dinero no da la felicidad.

Os recomendamos coger fuerzas en navidad y comenzar 2014 con más cariño hacia la pantalla negra ;)

Noticia en 20minutos

martes, 10 de diciembre de 2013

COBOL retoma la escena de TI

Desde Reclu IT nos llega esta noticia.

A todos los escépticos que piensan que COBOL ya no es necesario y está obsoleto, Micro Focus presenta un concurso para que los profesionales y estudiantes de TI mexicanos especializados en este lenguaje de programación desarrollen un videojuego.

Para la creación del juego los participantes deberán trabajar con Visual COBOL Personal Edition, los concursantes podrán crear su entrada sobre la base de cualquier videojuego existente, como la versión de Blitz de Space Invaders.

El ganador del primer lugar recibirá mil dólares y una versión exclusiva del Visual  COBOL; un Smartphone Xperia Z, para el segundo; y una tablet iPad Mini, para el tercero.

Se anima a los desarrolladores a ser creativos, combinando otros idiomas y tecnologías de programación para ofrecer un juego dinámico y atractivo para el usuario.

El plazo para la recepción de proyectos abrirá el 17 de diciembre 2013 y cerrará el 20 de enero 2014.
Algunos de los puntos que Micro Focus valorará son la creatividad, funcionalidad, capacidad, experiencia y el núcleo de las necesidades de tecnología.

Además se incentiva la consolidación de comunidad, ya que los participantes podrán mostrar avances de su trabajo en el Foro de la Comunidad COBOL, para obtener apoyo y retroalimentación sobre sus trabajos.
Con esta iniciativa los coboleros retoman el plano de las tecnologías, demostrando su vigencia en el mundo de las TI.

Aquí podrán consultar las bases del concurso:
http://academic.microfocus.com/code/index.asp


lunes, 9 de diciembre de 2013

Grace Murray Hopper

Tal día como hoy hace 31 años, nací yo. Y tal día como hoy hace 107 años, nación Grace Murray Hopper.
Qué fuerte, no?

Considerada la creadora del COBOL, participó en los comités de estandarización de los lenguajes de programación COBOL y FORTRAN (que increiblemente todavía se usa como lenguaje de estudio en los ciclos formativos, y el cobol no).

Murió con 85 años y no se retiró de la armada hasta los 79. Sinceramente espero no estar picando COBOL a esa edad!!!!

Vía wikipedia

Grace Murray Hopper (Nueva York, 9 de diciembre de 1906 - Condado de Arlington, 1 de enero de 1992) fue una científica de la computación y también una militar norteamericana, con grado de contraalmirante, considerada una pionera en el mundo de las ciencias de la computación. Fue la primera programadora que utilizó el Mark I y entre las décadas de los 50 y 60, propició la aplicación de los compiladores para el desarrollo de los lenguajes de programación y métodos de validación. Era conocida por sus amistades como la Amazing Grace.

lunes, 2 de diciembre de 2013

Contar posiciones desde el final: FUNCTION REVERSE

Hoy traemos un mini artículo sobre una opción de la sentencia INSPECT.

Lo más habitual es usar el INSPECT para reemplazar caracteres, o para contar posiciones de izquierda a derecha (ejemplo replacing, ejemplo tallying).
Puede darse el caso de que necesitemos conocer la posición donde está el último carácter informado de un campo. El problema se que no siempre tendremos un delimitador que nos lo indique para poder hacer un INSPECT TALLYING del modo tradicional.

En este caso entra en juego el INSPECT FUNCTION REVERSE. Como siempre, lo vemos mejor con un ejemplo.

Imaginad que tenemos una variable de longitud 80 que contiene un texto de longitud variable:

 01 WS-DATOS PIC X(80) VALUE 'X XX XXXXXX X X XXXXXXXXXXXX XXXX'
-               ' XX X XXXXX XXXXXXXXX                         '.

Necesitamos conocer cuanto mide la información que contiene, es decir, sin los espacios en blanco del final.

Para ello podemos usar la siguiente sentencia:

INSPECT FUNCTION REVERSE (WS-DATOS) TALLYING WS-LONG FOR LEADING SPACES

Donde WS-LONG es un campo con PIC S9(4) COMP que guardará la longitud de los espacios en blanco encontrados desde el final de la variable WS-DATOS hasta el primer carácter distinto de espacios.

Si restamos ese valor de la longitud total, tendremos la longitud de la información. En el ejemplo 54.