Obtener lista de valores de varias filas separados por comas con sql en Oracle 10g

Si queremos obtener  una lista de valores separados por comas, cuyos valores representen el contenido de una columna de varias filas, en Oracle 10g, podemos usar la función PL/SQL WMSYS.WM_CONCAT.

Veamos un ejemplo más ilustrativo:

Nos daría como resultado:

Una sola fila con la lista de los nombres de empleados separados por comas.

Podemos también mostrar los resultados agrupados por otro campo, por ejemplo el número de departamento:

Por cada grupo, en esta caso número de departamento, crea una lista de los empleados pertenecientes a cada uno.

Hay que comentar que Oracle no recomienda el uso de esta función porque no está soportada por ellos. De hecho en la versión 12g está fución ha sido eliminada. A partir de la versión 11g fue reemplazada por LISTAGG la cual veremos en otra entrada.

Es posible también lograr el listado de  nombres por departamento en Oracle 10g  sin utilizar la función WMSYS.WM_CONCAT. Utilizando las sentencias analíticas de Oracle que se muestran aquí.

¡Hasta la próxima!

Localizar una cadena de caracteres dentro de un campo en Oracle

A veces nos vemos en la necesidad de saber si en el valor de un campo de una tabla en Oracle se encuentra cierto caracter o secuencia de caracteres.

Oracle cuenta con la función INSTR para llevar a cabo esta tarea. La función regresa un número entero que indica la posición dentro de la cadena de caracteres que contiene el campo de el o la secuencia de caracteres buscados. Por ejemplo la siguiente instrucción:

Mostrará el nombre y la posición de la cadena RK dentro del nombre:

Como se muestra en los resultados, solo la fila con el valor de CLARK en la columna Nombre tiene el valor de que representa la posición inicial de la cadena RK en dicha columna.

¿Que representan los 4 valores o parámetros en la función INSTR? El primer parámetro es la cadena de caracteres donde se va a hacer la búsqueda, en este caso la columna ename de la tabla empEl segundo parámetro es la cadena que buscamos, en este caso RK. El tercer parámetro indica a partir de cual caracter queremos hacer la búsqueda, en este caso desde el caracter 1. El cuarto y último parámetro de la función indica que número de ocurrencia queremos encontrar, en este caso la primera ocurrencia; por ejemplo si quisiéramos encontrar la segunda ocurrencia de la cadena R en el Nombre sería:

Lo que nos arrojaría los siguientes resultados:

Como se puede observar, sólo en el nombre TURNER encontró una segunda ocurrencia de la cadena en la posición 6. El nombre CLARK, sólo tiene una ocurrencia de R por lo que el resultad arroja 0, es decir, no encontrado.

Ahora, ¿y si ponemos un número negativo en el parámetro que indica a partir de que caracter queremos buscar? Así:

Le estamos indicando que la búsqueda la haga de derecha a izquierda (de revesa) comenzando por la primera posición.  Esto nos daría el resultado siguiente:

Como podemos observar, ahora la consulta nos muestra el nombre TURNER y la posición de R en 3, que es la segunda ocurrencia de la R en TURNER pero de derecha a izquierda a partir de la posición 1 (contando de derecha a izquierda)Si le indicamos un -2 en la posición desde dónde queremos la búsqueda, buscará desde el penúltimo caracter hacia la izquierda, lo que nos dará un resultado de 0 en todas las filas, porque no hay ningún nombre que cumpla con la condición:

¿Alguna duda? Deja tu comentario.

¡Hasta la próxima!

 

Crear una tabla a partir de una consulta en Oracle

A veces necesitamos crear una nueva tabla con un subconjunto de datos de otra tabla para ya sea obtener reportes o analizar datos. El proceso podría ser, primero definir los campos y crear la tabla que va a contener los datos necesitados y luego insertar los datos por medio de una consulta (query) hecha a la tabla original.

Podemos ahorrarnos el paso de la definición de los campos y creación de la tabla utilizando la sentencia sql CREATE TABLE .. AS. La sentencia define los campos en base a los número y tipo de datos devueltos por la consulta.

Por ejemplo, tenemos una tabla llamada EMP que contiene información de los empleados de una empresa:

Con la siguiente estructura:

Y queremos crear una tabla que contenga sólo los campos EMPNO, ENAME y SAL y los datos de los empleados del departamento (DEPTNO) número 20. Para ello ejecutaríamos la siguiente sentencia SQL:

La sentencia anterior nos crea la tabla llamada departamento20 y con los datos de los empleados del departamento (DEPTNO) 20 como muestra la siguiente imagen:

Con la estructura que se muestra enseguida:

¡Nos vemos a la próxima!

ORA-30926: unable to get a stable set of rows in the source tables. Merge Oracle.

Oracle envía el error “ORA-30926: unable to get a stable set of rows in the source tables” cuando hacer una actualización a una tabla con la comando MERGE.

Este error es debido a que la sentencia está tratando de actualizar una misma fila (row) más de una vez. La solución es revisar los resultados que arroja la tabla o la consulta, que estamos utilizando para hacer la actualización, para que no arroje filas duplicadas.

¡Saludos!

SQL Developer 4.2 no depura procedimientos de Oracle 10g. Se ha producido un error al realizar la operación solicitada: ORA-00904.

Al actualizar la herramienta de Oracle SQL Developer a la versión 4.2 y querer depurar procedimientos PL/Sql que la versión anterior lo hacía sin problemas en mi base de datos Oracle 10g, no me permite ejecutarlos ahora, lanzando el error “Se ha producido un error al realizar la operación solicitada: ORA-00904: “OBJECT_ID”: invalid identifier. Código de proveedor 904″, como muestra la imagen siguiente:

Al parecer las tablas que usa la base de datos para llevar un control de el proceso de depuración ha cambiado y se ha agregado el campo OBJECT_ID que no existe en las versiones 10.2 y menores de Oracle. Con las versiones superiores, el procedimiento de depuración funciona sin problemas.

¿Solución? Instalar la versión 4.1 de SQL Developer para depurar dicha version de Oracle o inferior.

¡Saludos!

Auditar una tabla o usuario en #Oracle 10g

Antes de auditar una tabla o usuario de la base de datos Oracle, es necesario que ésta esté habilitada para ello. Los pasos aquí mostrados se deben hacer siempre con un usuario conectado con permisos administrativos (AS SYSDBA) como el usuario SYS.

Para saber si Oracle está habilitada para generar auditorías listamos el valor del parámetro AUDIT desde sqlplus o sqldeveloper autentificados con un usuario administrativo, por ejemplo SYS:

En mi caso la auditoría ya esta habilitada. Esto lo indica el parámetro audit_trail que tiene asignado el valor DB_EXTENDED. Por defecto, cuando se instala Oracle, la auditoría esta deshabilitada y este parámetro tiene el valor NONE

El valor DB_EXTENDED le indica a Oracle registrar los eventos de auditoría en la tablas SYS.AUD$. DB_EXTENDED registra, además de otros datos, tanto las variables encadenadas (bind) como las consultas ejecutadas, en los campos SQL_BIND y SQL_TEXT respectivamente.

Cambiemos el valor de audit_trail en caso de que tenga el valor NONE:

Para que este parámetro estático tome efecto y Oracle permita auditorías, es necesario dar baja y luego dar alta nuevamente la base de datos con los comandos SHUTDOWN y STARTUP respectivamente:

Bien, si vamos a auditar una tabla por cualquier operación que se haga sobre ella, ejecutaríamos la siguiente sentencia sql:

Le estamos indicando de cualquier operación o sentencia sql que se haga sobre la tabla facturas del esquema pagos, sea registrada. BY ACCESS indica que insertará un registro en las tablas de auditoría por cada operación que se haga en la tabla, la otra opción BY SESSION, registraría todas las operaciones a la tabla de una sesión de usuario en un sólo registro de auditoría.

Ahora si queremos auditar todas las operaciones de inserción, actualización y borrado a cualquier tabla que haga un usuario específico:

En este ejemplo estaremos auditando los insert, delete y update que haga en usuario pancho a cualquier tabla y registrando un registro en las tablas de auditoría por cada operación.

Para listar las operaciones de auditoría que ha registrado Oracle, podemos usar la vista dba_audit_trail:

Para más opciones de auditoría ver la ayuda de Oracle 10g. Espero y les ayude este post.

¡Visita los patrocinadores por favor!

¡Saludos!

 

 

 

 

 

¿Cómo encontrar un texto o palabra dentro de todas las funciones, procedimientos, disparadores y otros objetos en Oracle?

A veces nos vemos en la necesidad de saber dónde hacemos uso de un nombre de una tabla, función, variable, campo o un simple texto dentro del código fuente de los diferentes objectos de la base de datos Oracle.

Para localizar dónde se usa cierto nombre, palabra o texto podemos ejecutar la siguiente sentencia con el usuario SYS preferentemente:

En el ejemplo anterior estamos buscando el texto o palabra “VENTAS” dentro de todos los códigos fuente que definen los objectos de Oracle, como son procedimientos, funciones, disparadores.

Si encuentra la palabra buscada la consulta nos  como resultado el propietario, nombre de objeto, tipo del objeto, la linea donde encontró el texto y el texto completo de la linea.

Espero y les sea útil. ¡Hasta pronto!

shp2pgsql: el programa no puede iniciarse porque falta libiconv~2.dll

Hola a todos.

¿Te sucede que al ejecutar la utilería de postgis shp2pgsql, en la consola ms-dos de windows, te manda el siguiente mensaje de error?

Esto sucede con algunas versiones superiores a postgresql/postgis 9.2; debido a que las librerías .dll que necesita este programita ya no están más en el directorio bin de la carpeta de instalación de postgresql.

Ahora se encuentran esos .dll dentro de directorio bin/postgisgui dentro de la misma carpeta de instalación de postgresql.

Para solucionar el error, basta con agregar a tu variable de ambiente PATH este directorio, abrir una nueva ventana de consola de ms-dos y volver a ejecutar desde ahí el comando.

¡A convertir shapefiles a postgresql/postgis!

 

Obtener año, mes o día de un campo fecha en Oracle con EXTRACT.

A veces es necesario obtener sólo una parte de una fecha de un campo tipo datetime en sentencias SQL en Oracle. En un post pasado se explicó como obtener sólo el año, mes o día con la función to_char(). Ahora vamos a ver cómo obtener los mismos datos pero con la función extract().

En el ejemplo siguiente vamos a ver como obtener el día, mes o año de la fecha actual de la base de datos oracle:

A diferencia de la función to_char() que regresa un tipo caracter o alfanumérico, la función extract() regresa el resultado de tipo numérico.

La función extract() también puede extraer la hora, minuto y segundo de un dato tipo datetime:

¡Espero y les sea útil!

 

MySQL: table is marked as crashed and should be repaired

Después de una falla de energía del servidor de aplicaciones, nuestro sistema administrativo comenzó a enviar el error “table is marked as crashed and should be repaired” al querer acceder a cierta tabla de nuestra base datos.

Antes de restaurar dicha tabla desde un respaldo probamos reparar la tabla con la instrucción SQL de MySQL llamada “repair table” desde un cliente SQL de esta forma:

REPAIR TABLE nombre_tabla;

Donde “nombre_tabla” es el nombre de la tabla que esta enviando el error.

Esto funcionó en nuestro caso y no tuvimos necesidad de restaurar la table dañada desde un respaldo.

¡No olviden visitar a los patrocinadores (anuncios de google)!