martes, 28 de octubre de 2008

Cómo saber si Pro*C está instalado en Oracle

Pro*C es un producto que por ser pre-compilador no viene incluído en el sistema operativo, sino en la propia distruibución de Oracle. Es un componente opcional que se puede instalar utilizando el Oracle Universal Installer bajo el check [Oracle 9i Develpment Kit]/[Oracle Programmer]/Pro*C.
Generalmente utilizamos Pro*C en conjunción con algún compilador C nativo como gcc, el cual a diferencia del primero, es incluído por el sistema operativo.

Pro*C, cuando instalado en nuestra base de datos Oracle, es un ejecutable:

$ORACLE_HOME/bin/proc

Si el ejecutable no se encuentra en esa ubicación, verificar si efectivamente el componente no fue incluído en la instalación.

Ejecutar el OUI y confirmar si entre las opciones instaladas el componente no aparece listado.

Cuando operamos bases de datos remotamente, a veces no tenemos ambiente gráfico, y por razones de conectividad, ni siquiera nos es posible exportar el OUI hacia nuestra consola. Deberemos entonces leer el log de instalación de la base de datos (disponible en $ORACLE_BASE/oraInventory/logs), y buscar si una entrada como la siguiente es listada:

Pro*C/C++ 9.2.0.4

En caso de no encontrarlo, entonces deberemos instalarlo usando el OUI.

lunes, 27 de octubre de 2008

Application Express y su supervivencia

Application Express, también conocida como APEX o HTMLDB, es la herramienta de desarrollo web de Oracle, que viene incluída en Oracle XE lista para usar. A la fecha de hoy, la versión actual (3.1.2) puede descargarse gratuitamente e instalarse en todas las versiones de la base de datos a partir de 9i R2 (incluída la versión XE, también gratuita). Aplication Express es un recurso gratuito tanto para desarrollar como para implantar, inclusive en ambientes de producción, no require de licencias ni posee limitaciones de distribución.

Desde 2004 a la fecha, la tecnología que ofrece APEX continúa siendo avanzada y cada vez más rica en recursos (AJAX, Web Services, CSS, Javascript, XML, etc) y es realmente rápido lograr resultados profesionales, pudiendo optar por diversas opciones de arquitectura y no teniendo que pagar absolutamente nada por ello.
¿Porqué entonces APEX continúa en las sombras, no logrando transformarse en una verdadera opción para los desarrolladores open source?

Pese a los esfuerzos de Oracle por disponibilizar gratuitamente esta tecnología, APEX nació con limitantes importantes que impiden su crecimiento en popularidad: no abundan los servicios de hosting gratuito de workspaces de Aplication Express (como sí los hay para otras tecnologías de libre uso). El libre licenciamiento de Oracle Aplication Express no es debidamente acompañado con los permisos de utilización del servidor de aplicaciones y base de datos requerida para estos fines. Para las empresas, no es redituable ofrecer APEX, ya que deben soportar las licencias de una de las bases de datos más costosas del mercado. APEX termina confinado a la privacidad de las intranets corporativas y los computadores portátiles.

¿No sería una buena movida estratégica para Oracle crear un nuevo tipo de licenciamiento que permita implantar bases de datos con mayor capacidad para ofrecer exclusivamente servicios de hosting APEX? ¿Porqué no difundir un producto, cuyo desarrollo le significa una cara inversión (300,000 líneas de código) destinada a satisfacer las necesidades de unos pocos? Con una comunidad tan reducida, el crecimiento de APEX es bastante más lento de lo que podría ser, dejándolo en amplia desventaja respecto a otros lenguajes de desarrollo web. Sin ir más lejos, fue así que Forms perdió vigencia, y cada vez más de estas aplicaciones emigran hacia otros lenguajes web, aún perdiendo parte de la seguridad y consistencia que Forms ofrece.

No se ven planes para intentar captar un público más amplio, sino de terminar de cerrar sus filas reclutando a los desarrolladores de Forms: la próxima versión de Aplication Express incluirá un convertidor de Forms a APEX, con lo que se facilitará la migración de estas aplicaciones a lo que será su sustituto inevitable.

Vea también:
Descargue la última versión de APEX
Cómo saber si tiene APEX instalado

viernes, 19 de septiembre de 2008

Generando planillas Excel con SQL*plus

Una de los comandos más interesantes de SQL*plus para formatear salida, es MARKUP HTML. Con el, podemos generar código HTML listo para mostrar en cualquier navegador.

Sintaxis básica: SET MARKUP HTML ON

Ejemplo:

SQL> set markup html on
SQL> spool tablas.html
SQL> select table_name, tablespace_name from user_tables;
SQL> spool off


Visto en el navegador, nuestra consulta de dos columnas es formateada como una tabla HTML.





Lista para Excel


Lo interesante de Excel es que permite ver páginas html como si fuesen planillas. Cuando abrimos el spool generado por SQL*plus, tenemos una planilla Excel pronta para usar.

Como el formato HTML generalmente es abierto por otras aplicaciones, podemos generar el spool como .xlt, y de esta forma abriremos el archivo en Excel con solamente dos clicks.


viernes, 1 de agosto de 2008

¿Cómo generar una fecha aleatoria con PL/SQL?

El paquete dbms_random implementa algunas funciones aleatorias de utilidad para generar números y strings aleatorios, pero no para fechas. Para generar fechas al azar, podemos sumar o restar una cantidad X de días a sysdate. El único detalle respecta al período de fechas que queremos obtener, debemos ajustar adecuadamente el número de días que se van a sumar/restar a la fecha actual.
CREATE TABLE fechas_aleatorias (fecha DATE);

DECLARE
sd NUMBER;
dias NUMBER := 5000; --max de dias que se suman/restan a sysdate
dia DATE;
BEGIN
-- inicializacion del seed
SELECT to_char(systimestamp,'FF') INTO sd FROM dual;
dbms_random.initialize(sd);

FOR i in 1..10000
LOOP
dia := TRUNC(sysdate) + dbms_random.value(-dias,dias);
INSERT INTO fechas_aleatorias VALUES (dia);
END LOOP;
END;

sábado, 26 de julio de 2008

ORA-01440: column to be modified must be empty to decrease precision or scale

ALTER TABLE t1 MODIFY (nr_pct NUMBER(5,2))
ORA-01440: column to be modified must be empty to decrease precision or scale
¿Cómo disminuir la longitud de una columna con datos y evitar el error?

Para este ejemplo, vamos a agregar una dificultad extra: la columna que queremos alterar es NOT NULL.

Presento dos formas de hacer esto con SQL*Plus:


FORMA 1: VACIANDO Y ALTERANDO


Respaldar la columna
CREATE TABLE t1_backup AS SELECT id, nr_pct FROM t1;
Setear la columna como NULL
ALTER TABLE t1 MODIFY (nr_pct NULL);
Vaciar la columna
UPDATE t1 SET nr_pct=NULL;
Ajustar el tamaño deseado de la columna
ALTER TABLE t1 MODIFY (nr_pct NUMBER(5,2));
Cargar los datos a la columna
UPDATE t1 SET nr_pct=(SELECT nr_pct FROM t1_backup WHERE t1_backup.id=t1.id);
Alterar la columna como NOT NULL nuevamente
ALTER TABLE t1 MODIFY (nr_pct NOT NULL);

Ventajas: Se preserva el orden de las columnas dentro de la tabla
Desventajas: Poco performante para tablas muy grandes (millones de datos), requiere crear un índice en la tabla t1_backup para mejorar la performance


FORMA 2: AGREGANDO COLUMNA EXTRA

Agregar una columna a la tabla con el tamaño deseado
ALTER TABLE t1 ADD (nr_pct_2 NUMBER(5,2) NOT NULL);
Cargar la nueva columna con los datos
UPDATE t1 SET nr_pct_2=nr_pct;
Eliminar la columna original
ALTER TABLE t1 DROP COLUMN nr_pct;
Renombrar la nueva columna al nombre de la original
ALTER TABLE t1 RENAME COLUMN nr_pct_2 TO nr_pct;

Ventajas: Más performante que la forma 1 para tablas grandes. Más fácil de realizar.
Desventajas: Sólo aplicable a 9i o superiores (8i no posibilita el renombrado de columnas).
La columna alterada quedará al final de la tabla si hacemos un DESC.