Crear Tablas en ORACLE 11g

Lo primero, como siempre, nos conectamos al ORACLE Enterprise Manager 11g, a través de la dirección https://localhost:1158/em. Ahí introducimos user/password, tras "autorizar" la dirección como certificado correcto..."Vaya a este sitio web (no recomendado)", y entramos en el panel de control por https, que es muy intuitivo y facilita la gestión en la red sin tener que instalar nada más en ningún puesto cliente. Otra opción, claro, es entrar al SQL Plus, y tras logarnos igual que en el Enterprise Manager, empezar a lanzar los comandos SQL correspondientes para crear, modificar, eliminar, etc todo lo que necesitemos. Paralelamente iremos comentando los comandos necesarios para hacerlo desde la consola SQL Plus. Aquí tenemos el Enterprise Manager una vez hemos entrado:


Pulsamos sobre Esquema, y en Objetos de Base de Datos, pulsamos sobre Tablas. En este apartado pulsamos en Crear, y se nos requiere informar sobre la Organización de la Tabla (estándard ó organizada por índices). Esto hace referencia a cómo se guardará en memoria la tabla: la primera opción (estándard) puede ser Temporal, o no, y tiene una organización en Pilas. La organización IOT (Tabla Organizada por Índices) se almacena en una estructura de índices en B-árbol. De momento vamos a crear las tablas según los valores por defecto, en este caso, con organización estándard, aunque IOT tiene muchísimas ventajas, como ya veremos, sobre todo reducen la fragmentación de grandes tablas, además de eliminar las claves primarias y guardándolas en el índice, ahorrando espacio de disco (para estudiar más en profundidad este tema puede consultar el libro "Oracle Job Scheduling" del Dr. Tim Hall). Ahora pulsaremos en Continuar y comenzaríamos a diseñar nuestra tabla. En este punto es vital conocer los distintos tipos de datos que Oracle pone a disposición del DBA. Aquí hacemos un breve resumen:
Tipo Dato
Descripción
VARCHAR2(size [BYTE | CHAR])Cadena de caracteres de longitud variable que tiene como tamaño máximo el valor de size en BYTE o CHAR. El tamaño máximo es de 4000 bytes o caracteres, y la mínima es de 1 byte o un carácter. Se debe especificar el tamaño de para VARCHAR2.
NVARCHAR2(size)Cadena de caracteres Unicode de longitud variable con size como máximo tamaño de longitud. El número de bytes que pueden ser hasta dos veces el tamaño de codificación AL16UTF16 y tres veces el tamaño de la codificación UTF8. El tamaño máximo está determinado por la definición del juego de caracteres nacional, con un límite máximo de 4000 bytes. Se debe especificar el size de NVARCHAR2.



NUMBER [ (p [, s]) ]
Número con p precisión (parte entera) y s escala (parte decimal). La precisión p puede variar de 1 a 38. La s escala puede variar desde -84 hasta 127. Tanto la precisión y la escala se encuentran en dígitos decimales. Un valor numérico requiere 1 a 22 bytes.
FLOAT [(p)]Un subtipo del tipo de datos NUMBER con precisión p. Un valor de coma flotante se representa internamente como un NUMBER. La precisión p puede variar desde 1 hasta 126 dígitos binarios. Un valor flotante requiere 1 a 22 bytes.
LONGTipo de datos de caracteres de longitud variable de hasta 2 gigabytes, o 231 -1 bytes. Permanece para compatibilidad con versiones anteriores de Oracle.
DATEIntervalo de fechas válidas del 1 de enero de 4712 antes de Cristo a el 31 de diciembre de 9999. El formato por defecto se determina explícitamente por el parámetro NLS_DATE_FORMAT o implícitamente por el parámetro NLS_TERRITORY. El tamaño es de 7 bytes. Este tipo de datos contiene los campos de fecha y hora AÑO, MES, día, hora, minuto y segundo. No tiene fracciones de segundo o de una zona horaria.
BINARY_FLOATNúmero en coma flotante de 32 bits. Este tipo de datos requiere 4 bytes.
BINARY_DOUBLENúmero en coma flotante de 64 bits. Este tipo de datos se requieren de 8 bytes.
TIMESTAMP [(fractional_seconds_precision)]Año, mes y día como valores de la fecha, así como la hora, minutos y segundos como valores de tiempo, donde fractional_seconds_precision es el número de dígitos en la parte fraccionaria del segundo del campo datetime. Los valores aceptados de fractional_seconds_precision son del 0 al 9. El valor por defecto es 6. El formato por defecto se determina explícitamente por el parámetro NLS_TIMESTAMP_FORMAT o implícitamente por el parámetro NLS_TERRITORY. El tamaño es de 7 o 11 bytes, dependiendo de la precisión. Este tipo de datos contiene los campos datetime AÑO, MES, DIA, HORA, MINUTO y SEGUNDO. Contiene las fracciones de segundo, pero no tiene una zona horaria.
TIMESTAMP [(fractional_seconds_precision)] WITH TIME ZONETodos los valores de TIMESTAMP, así como el valor de tiempo de desplazamiento de la zona, donde fractional_seconds_precision es el número de dígitos en la parte fraccionaria del segundo del campo datetime. Los valores aceptados son del 0 al 9. El valor por defecto es 6. El formato por defecto se determina explícitamente por el parámetro NLS_TIMESTAMP_FORMAT o implícitamente por el parámetro NLS_TERRITORY. El tamaño se fija en 13 bytes. Este tipo de datos contiene los campos datetime AÑO, MES, DIA, HORA, MINUTO, SEGUNDO, TIMEZONE_HOUR y TIMEZONE_MINUTE. Cuenta con las fracciones de segundo y una zona horaria explícita.
TIMESTAMP [(fractional_seconds)] WITH LOCAL TIME ZONETodos los valores de TIMESTAMP WITH TIME ZONE, con las siguientes excepciones:
* Los datos se normalizan con la zona horaria de base de datos cuando se almacenan en la base de datos.
* Cuando se recuperan los datos, los usuarios ven los datos en la zona de tiempo de la sesión.
El formato por defecto se determina explícitamente por el parámetro NLS_TIMESTAMP_FORMAT o implícitamente por el parámetro NLS_TERRITORY. El tamaño es de 7 o 11 bytes, dependiendo de la precisión.
INTERVAL YEAR [(year_precision)] TO MONTHAlmacena un período de tiempo en años y meses, donde year_precision es el número de dígitos en el campo datetime AÑO. Los valores aceptados son del 0 al 9. El valor predeterminado es 2. El tamaño se fija en 5 bytes.
INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds)]Almacena un período de tiempo en días, horas, minutos y segundos, donde
* day_precision es el número máximo de dígitos en el campo datetime DÍA. Los valores aceptados son del 0 al 9. El valor predeterminado es 2.
* fractional_seconds_precision es el número de dígitos en la parte fraccionaria del campo SEGUNDO. Los valores aceptados son del 0 al 9. El valor por defecto es 6.
El tamaño se fija en 11 bytes.
RAW(size)Datos binarios sin formato de longitud size. El tamaño máximo es de 2000 bytes. Se debe especificar el tamaño de un valor RAW.
LONG RAWDatos binarios de tipo RAW de longitud variable hasta 2 gigabytes.
ROWIDCadena en base 64 que representa la dirección única de una fila en la tabla. Este tipo de datos es principalmente para los valores devueltos por la pseudo columna ROWID.
UROWID [(size)]Cadena en base 64 que representa la dirección lógica de una fila de una tabla de índice organizado. El tamaño opcional es el tamaño de una columna de tipo UROWID de Oracle. El tamaño máximo y por defecto es de 4000 bytes.
CHAR [(size [BYTE | CHAR])]Cadena de caracteres de longitud fija de size bytes de tamaño o size de caracteres. El tamaño máximo es de 2000 bytes o caracteres, el tamaño predeterminado y mínimo es de 1 byte.
NCHAR[(size)]Cadena de caracteres de longitud fija de size caracteres de tamaño de largo. El número de bytes pueden ser hasta dos veces el tamaño de codificación AL16UTF16 y tres veces el tamaño de la codificación UTF8. El tamaño máximo está determinado por la definición del juego de caracteres nacional, con un límite máximo de 2000 bytes. El tamaño predeterminado y mínimo es de un carácter.
CLOBUn objeto de tipo LOB que contiene caracteres de un byte o multibyte. Son compatibles tanto de ancho fijo y conjuntos de ancho variable de caracteres, con el carácter de base de datos establecida. El tamaño máximo es (4 gigabytes - 1) * (tamaño del bloque de la base de datos).
NCLOBUn objeto de tipo LOB que contiene caracteres Unicode. Son compatible tanto de ancho fijo y conjuntos de ancho variable de caracteres, con el conjunto base de datos de carácter nacional. El tamaño máximo es (4 gigabytes - 1) * (tamaño del bloque de la base de datos). Guarda los datos nacionales sobre el conjunto de caracteres.
BLOBUn objeto de tipo LOB binario. El tamaño máximo es (4 gigabytes - 1) * (tamaño del bloque de la base de datos).
BFILEContiene un localizador a un archivo binario almacenado fuera de la base de datos. Permite flujo de bytes de E/S para el acceso a LOB externos que residen en el servidor de base de datos. El tamaño máximo es de 4 gigabytes.

'Hola Mundo' en Java

Vamos a comenzar viendo conceptos básicos, tanto del NetBeans IDE, como del lenguaje Java en general. De hecho vamos a ver los pasos necesarios para crear la típica aplicación Hola Mundo.
Una vez abierto el IDE, abrimos la opción File:New Project, y seleccionamos Java, en las categorías, y como tipo de proyecto Java Application. Pulsamos el botón Next, y Java SE empezará a activarse. Configuramos y establecemos el nombre y ubicación de nuestro proyecto y pulsamos Finish.


Se crea el proyecto, y en el IDE podemos identificar las siguientes ventanas:

- Projects: una vista de árbol de todos los componentes del proyecto
Source Editor, con el fichero HolaMundoApp abierto
- Navigator, que sirve para navegar entre los elementos de la clase seleccionada.
- Tasks, que listará los errores de compilación, así como otras tareas que son marcadas con palabras claves como XXX y TODO.


Comenzamos a escribir código a partir de la línea  // TODO code application logic here.
Ahí escribimos System.out.println("Hello World!");
Salvamos el proyecto usando la opción del menú File:Save (o pulsando Ctrl+S). Importante saber que al guardar el código, NetBeans automáticamente lo compila. Así que sólo resta ejecutarlo, usando la opción Run:Run Main Project (o pulsando F6). El resultado es el esperado:






¿COBOL en Visual Studio 2010? ¡Sí!

Para muchos desarrolladores COBOL del mundo (entre los que me incluyo) siempre había sido un deseo confesable el poder usar un único entorno en caso de desarrollar en otros lenguajes habitualmente. Pues bien, este producto, llamado COBOLizer, nos permite mantener nuestras aplicaciones COBOL sin tener que salir de nuestro IDE favorito,Visual Studio 2010. Aporta asistentes para crear proyectos específicos en este lenguaje, Intellisense, Cliente de Terminal integrado para gestionar las operaciones en el mainframe, editor del código fuente personalizado y muchas más novedades. Otra prueba más de que ¡Cobol sigue vivo!.

TOPs de distintos valores en SQL ¿es posible?

Sí, por casualidades de la vida, voy y me encuentro esta cuestión hace unos días encima de la mesa. El objetivo es claro: de lo obtenido en una consulta más o menos compleja, tengo que listar los "x" primeros resultados según cierto criterio y según un campo resultado de dicha consulta ... pero también los "x" primeros de los distintos valores de esos resultados. Parece un lío, ¿no?. Pero con este ejemplo veréis lo sencillo que es. Si es que no hay nada como la simplicidad, y más con las Bases de Datos, jejeje. Así que antes de ponerte a hacer algún que otro cursor, función o procedimiento almacenado estudia bien el ejemplo y seguro te será de utilidad algún día (esa es mi intención). Cuando te bajes el ejemplo (como todos a partir de ahora), ábrelo con el bloc de notas de Windows por ejemplo, y copia y pega el contenido en una pestaña (Nueva consulta) en el SQL Server Management Studio (SMSS). Pulsa F5 para ejecutar la consulta (o pulsa sobre el botón correspondiente). El script generará unas tablas temporales de ejemplo, insertará unos pocos registros, ejecutará la consulta (select)  que recomiendo "estudiar" y por último borrará las tablas. La base es la instrucción:

ROW_NUMBER() OVER (PARTITION BY campo1 ORDER BY campo2 desc) AS indice

Con ello conseguimos "dividir" el listado según los valores de campo1 y ordenarlos según los valores de campo2. A continuación basta con filtrar el listado final con un indice<=num_registros_top para obtener en una única y simple consulta los top "num_registros_top" de cada campo1 (en el ejemplo se muestran, para cada artículo, los TOP 2 países donde más se ha vendido dicho artículo). Fácilmente podemos incluir el resultado como subconsulta de otra similar y obtener los Tops de los Tops, etc. Nos vemos.

Buscar en el Blog: