Publicado el

Error ORA-30036 al ejecutar SHRINK sobre una tabla

Después de borrar millones de registros de una gran tabla en Oracle y tratar de reclamar espacio de dicha tabla, el comando SHRINK SPACE no terminaba y marcaba el error:

ORA-30036: unable to extend segment by 8 in undo tablespace ‘UNDO’.

El tamaño de la tabla no era tan grande como el espacio reservado para el tablespace UNDO (aquí se almacenan los registros para hacer un rollback de una transacción), sin embargo se llenaba y marcaba el error mencionado.

Cuando se ejecuta la sentencia ALTER TABLE … SHRINK SPACE es necesario también tomar en cuenta el tamaño de los índices de la tabla. Así que la suma del tamaño de la tabla de la cual necesitaba reclamar espacio y el tamaño de todos sus índices, si que superaba el espacio del tablespace UNDO por eso lanzaba el error.

La solución, borrar todos los índices (DROP INDEX) de la tabla, reclamar el espacio (SHRINK SPACE) de la tabla y volver a crear los índices.

Espero y les sirva mi experiencia.

¡Saludos!

Publicado el

¿Vendes aplicaciones programadas con Java Oracle SE 8? Esto te interesa.

A partir del 2019, el uso no personal de desarrollos en Java SE 8 cambia de licencia comercial:

“Las actualizaciones públicas de la versión 8 de Oracle Java SE seguirán disponibles para uso personal e individual al menos hasta finales de 2020.

Las actualizaciones públicas de la versión 8 de Oracle Java SE que se lancen a partir de enero de 2019 no estarán disponibles para uso empresarial, comercial o de producción sin licencia comercial.”

Para más información y detalles visita: https://www.java.com/es/download/release_notice.jsp

La opción ¿ OpenJDK?

Publicado el

Numerar por grupos los resultados de una consulta SQL en Oracle

En el post pasado vimos como numerar los resultados de una consulta desde 1 a el total de registros devueltos por la consulta con la función ROW_NUMBER(). Ahora queremos que numere desde 1  hasta el número de registros que exista en cada grupo distinto de datos que regrese la consulta. Para ejemplificar usaremos la consulta siguiente a la tabla EMPLOYEES:

PARTITION BY le indica a la función ROW_NUMBER(), que va a numerar a partir de 1 por cada grupo de registro con diferente valor en el campo DEPARTMENT_ID.  ORDER BY le indica que va a numerar los registros de cada grupo de acuerdo al orden ascendente del valor del campo LAST_NAME

Veamos el fragmento del resultado que daría la consulta SQL anterior para entender mejor el funcionamiento:

Como vemos en el resultado, la numeración (columna NUMERO_CONSECUTIVO en el resultado) reinicia con 1 por cada valor de DEPARTMENT_ID distinto y los numera de acuerdo al orden del valor LAST_NAME: en el DEPARTMENT_ID “10” sólo existe 1 empleado y tiene el valor de “Whalen” en el campo LAST_NAME. En el DEPARTMENT_ID “20” existen 2 empleados con los valores “Fay” y “Hartstein” y los numeró de acuerdo al orden alfabético, a “Fay” le dió el NUMERO_CONSECUTIVO “1” y a “Hartstein” el 2. En el DEPARTMENT_ID “30” hay 6 empleados y los numeró del 1 al 6 de acuerdo al orden alfabético de LAST_NAME y así sucesivamente con el resto de los empleados.

Si existiera una clausula ORDER BY en la sentencia, el orden del despliegue de salida  sería por los campos indicados en dicha cláusula.

¿Dudas? ¿Preguntas? Deja tus comentarios. ¡Hasta la próxima!

 

 

Publicado el

Numerar los resultados de una consulta SQL en Oracle

Queremos que los resultados de una consulta SQL en una base de datos ORACLE sean numerados del 1 al total de registros o filas obtenidas en la consulta.

Para ello podemos utilizar la función ROW_NUMBER()  de la siguiente forma:

Nos daría como resultado algo como esto:

En la sentencia SQL anterior, estamos indicando que numere los resultados de acuerdo al orden del campo DEPARTMENT_NAME (nombre del departamento) y le asigne a esa numeración el nomnre de NUMERO_CONSECUTIVO.  La cláusula ORDER BY en la función ROW_NUMBER() es obligatoria. Este ordenamiento es independiente de el orden que se le puede dar al resultado final. Si sólo existe el ordenamiento de la función ROW_NUMBER() en la sentencia SQL, el resultado de la consulta saldrá ordenado por el orden indicado en ésta. Por ejemplo la siguiente sentencia:

En donde agregamos que muestre el campo DEPARTMENT_ID y que el resultado final lo ordene por éste mismo campo, daría como resultado esto:

Como se puede observar, el orden del resultado ahora es por el campo DEPARTMENT_ID, sin embargo la numeración es asignada de acuerdo al orden del campo DEPARTMENT_NAME. Como vemos el departamento  llamado “Accounting” sigue conservando el número 1 en la columna “NUMERO_CONSECUTIVO”, el departamento “Administration” el número 2 y así sucesivamente.

¿Dudas? Deja tu comentario.

¡Hasta la próxima!

 

Publicado el

Cómo definir una llave primaria (primary key) en una tabla existente en Oracle.

Supongamos que tenemos una tabla sin llave primaria y todos sus campos fueron definidos para aceptar valores nulos. El comando CREATE TABLE de dicha tabla se ejecutó así:

Una llave primaria o PRIMARY KEY puede estar formada por uno o varios campos, cuyos valores permiten identificar un sólo registro en la tabla. Luego entonces el campo que vayamos a escoger no debe permitir valores nulos (sin valor) ni repetidos. Identificamos que los valores del campo CVE_ENT son irrepetibles y que identifican a un sólo registro en la tabla.

Para modificar las propiedades de este campo y  que este no permita nulos de ahora en adelante, ejecutamos la siguiente sentencia:

Alteramos la tabla ENTIDAD modificando el campo CEV_ENT especificándole la restricción NOT NULL. Una vez ejecutada la sentencia, el campo ya no permitirá valores nulos.

Una vez logrado esto, procedemos a definir el campo CEVE_ENT como llave primaria de la tabla de esta forma:

Alteramos la tabla ENTIDAD agregando la restricción llave primaria (PRIMARY KEY) llamada ENTIDAD_PK conformada por el campo CVE_ENT.

Cabe aclarar que la restricción PRIMARY KEY, en Oracle, lleva implícito el no aceptar valores nulos en los campos que la conforman, sin embargo es buena práctica especificar explícitamente antes que el campo o campos que conformarán dicha llave primaria no acepten nulos con la sentencia ALTER que vimos anteriormente, ya que algunos motores de bases de datos así lo requieren.

¡Hasta la próxima!

 

 

 

Publicado el

Como conectar a una base de datos Oracle 12c desde una aplicación .Net sin usar archivo tsnames.ora.

Enseguida les comparto el código en ¢# (c sharp) para hacer una conexión a una base de datos Oracle 12c desde una aplicación .Net sin usar archivo tsnames.ora externo que defina la conexión.

Antes de ejecutar el código sobra decir que debes contar con los controladores .Net (drives)  de conexión a Oracle 12c instalados en la máquina de desarrollo y el proyecto debe hacer referencia a la clase Oracle.ManagedDataAccess.

No olvides cambiar los valores de HOST (nombre o ip de la computadora donde está instalada la base de datos), PORT (puerto de conexión), SERVICE_NAME (nombre de la instancia de la base de datos Oracle), User Id (usuario) y Password (contraseña), por los valores correctos de tu base de datos.

¡Hasta la próxima!

Publicado el

Formatear campo fecha con sql en Oracle con la función to_char().

Varias formas de mostrar un campo fecha con la función to_char()  de sql en Oracle; asumimos en los ejemplos siguientes, que  el campo s.CREATED  es un campo de tipo date de una tabla cualquiera; abajo de cada uno se muestra la salida que obtendríamos para un mismo valor del campo aplicando la función to_char():

¡Espero y les sea útil!

¡No olviden visitar a los anunciantes!¡Hasta la próxima!

Publicado el

Fallo con la variable PATH al comprobar requisitos al instalar Oracle 12c.

Si al instalar Oracle 12c en Windows 10 te muestra un estado fallido relacionado con la variable PATH al momento de comprobar requisitos del sistema y, según el mensaje de verificación dice que se debe a la longitud de la variable PATH, puede que no sea la longitud de dicha variable el problema.

Al mostrar detalles del mensaje decía esto: “PRVF-3919 : Failed to retrieve value of environment variable “PATH”” y sugiere que pueden ser errores de privilegios o permisos como muestra la siguiente imagen:

Si revisas tu variable PATH y encuentras que su valor no está demasiado grande (más de 1024 caracteres) entonces puedes sin problemas indicarle al instalador que ignore el error activando  el cuadro de selección “Ignorar Todo” y proceder con la instalación. Así lo hice y Oracle está funcionando correctamente. Al parecer es un bug del instalador con la versión de Windows 10.

Que éste artículo les sea útil. ¡Hasta la próxima!

 

 

Publicado el

Instalar Oracle Sql Developer en Windows

Oracle Sql Developer es un programa gratuito creado por Oracle en lenguaje de programación Java para desarrollar y administrar su base de datos. El programa se puede descargar gratuitamente del sitio de Oracle.

Para descargar la versión más reciente del programa, abre la siguiente dirección en tu navegador preferido: http://www.oracle.com/technetwork/developer-tools/sql-developer/overview/index.html.

Aparecerá la siguiente página:

Da clic en el botón Download para proceder a descargar el programa. Aparecerá la página de descargas:

Selecciona la opción Accept License Agreement para aceptar las condiciones de licencia y de clic en la liga Download  que se activa (marcada con una flecha en la imagen siguiente) a la versión correspondiente a tu equipo (si tienes equipo con Windows de 64 bits selecciona Windows 64-bit with JDK incluided, esta versión del instalador, instalará tanto el programa como la versión necesaria de Java).

Si tienes Windows de 32 bits, será necesario descargar e instalar el programa JDK 8 (Java 8), antes de proceder a la instalación de Sql Developer. Si es el caso, ve a la sitio de descargas de Java dando clic en la liga JDK 8 (ver la imagen anterior)  o da clic aquí. Acepta la licencia y descarga la versión más reciente del producto llamado Windows x86. Una vez descargado, sigue las indicaciones que te mostrará el instalador.

Una vez que diste clic en la liga de descarga del SQL Developer, se te pedirá los datos de inicio de sesión en Oracle:

Si aún no has creado una cuenta en Oracle, da clic en Crear una cuenta. En caso contrario, proporciona el usuario y la contraseña y oprime Iniciar sesión. La descarga de de SQL Developer se iniciará.

Se descargará un archivo de tipo zip (comprimido), cuyo nombre pude variar al mostrado de acuerdo a la versión descargada,  el que contiene la carpeta de la aplicación comprimida:

El archivo de tipo zip no contiene un instalador de windows, contiene una carpeta llamada sqldeveloper que deberá ser extraída junto con su contenido en el lugar de tu preferencia:

En mi caso la descomprimí y copié al directorio  C:\Herramientas que creé previamenteNavegamos dentro de la carpeta sqldeveloper y ejecutamos el archivo sqldeveloper.exe dando doble clic sobre el.

Nos preguntará si deseamos importar la configuración de algún Sql Developer anterior, selecciona de acuerdo si quieres importar la configuración de una versión anterior o no. La imagen muestra que encontró una versión antigua, pero le diré que no me importe la configuración:

Nos aparecerá la pantalla principal de SQL Developer y nos preguntará si queremos estar enviando datos a Oracle para seguimiento de uso. La respuesta dependerá de ti. En mi caso le diré que no deseo enviar datos por lo que quitaré la opción Permitir informes de uso automáticos a Oracle y oprimiré el botón Aceptar.

¡Listo! Nos mostrará la pantalla principal de SQL Developer:

En artículos posteriores veremos el uso de este programa.

¿Te fue útil este artículo? Por favor visita los anuncios de los patrocinadores para seguir publicando más artículos como estos. ¿Alguna observación o sugerencia? Utiliza los comentarios.

¡Hasta pronto!

Publicado el

Mostrar el nombre del mes actual en español en Oracle usando la función to_char y sysdate.

¿Como forzar que la función to_char de Oracle regrese el nombre del mes en español? Cuando el sistema operativo de un equipo cliente, donde se ejecutan sentencias Sql de Oracle que obtienen el nombre del mes está en otro lenguaje que no sea español, el nombre del mes lo regresa en el idioma por defecto. Por ejemplo, si ejecutamos la sentencia de la siguiente forma en un equipo cliente donde su lenguaje es inglés:

Nos regresaría el nombre del mes en inglés como se muestra.

Si queremos forzar que regrese el nombre del mes en otro lenguaje, por ejemplo español, utilizaríamos esta forma:

Ahora el nombre del mes lo regresa en el lenguaje especificado.

O en lenguaje italiano sería:

¿Te fue útil el artículo? Por favor visita los patrocinadores para seguir publicando artículos como estos. ¿Tienes alguna duda informática? Déjame tu comentario.

¡Saludos!