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!

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!

 

ORA-32033: unsupported column aliasing

Oracle arroja este error cuando se utiliza WITH en alguna consulta y se ha olvidado poner la palabra reservada AS. Por ejemplo en este caso:

Lo correcto sería:

No olvides visitar a los patrocinadores (da click en los anuncios) para seguir soportando este sitio.

¡Gracias!

Listar las tablas de un usuario en Oracle

A veces necesitamos saber las tablas pertenecientes a un usuario y/o esquema en Oracle. Si queremos saber las tablas que le pertenecen al usuario con el que cual nos encontramos conectados actualmente a la base de datos, usamos la siguiente instrucción sql:

La instrucción anterior además ordena la salida por el campo table_name.

Si lo que queremos saber son las tablas de otro usuario o esquema entonces usaríamos la siguiente sentencia sql:

Igual que la anterior, el resultado lo ordenamos por table_name.

Espero que les sea útil este post.

¡Saludos!

ORA-39070: Unable to open the log file.

Al intentar importar un respaldo de una base de datos en Oracle 11g versión 11.2 sobre windows server  con el comando impdp me mandaba los siguientes errores:

ORA-39002: invalid operation
ORA-39070: Unable to open the log file.
ORA-29283: invalid file operation
ORA-06512: at “SYS.UTL_FILE”, line 488
ORA-29283: invalid file operation

Cabe aclarar que el archivo dmp a importar estaba en una unidad de red montada como drive Z: y dicha unidad estaba dado de alta como un Directory de Oracle.

El problema se debe a que al ejecutar el comando impdp lo ejecuta con el usuario que inició el servicio de oracle (usuario del sistema) y no con el usuariode windows que ejecuta el comando,  por lo tanto dicho usuario del sistema no tiene permisos de escritura ni lectura sobre la unidad de red.

La solución es parar el servicio de oracle e iniciarlo con el usuario con el que se autentifica en windows y que tiene permisos tanto de escritura sobre la unidad como de ejecutar el comando impdp:

Inicio -> Ejecutar -> Services.msc -> OracleServiceXXXX -> Propiedades -> Log On

Una vez que termine de importar el respaldo, puede regresar el servicio de oracle a que sea ejecutado por el usuario del sistema.

Espero les sirva este tip.

 

 

Dividir (split) el valor de una columna con valores separados por comas en Oracle

Me encontré con este problema, una tabla en oracle contenía un campo con una serie de valores separado por coma como en el siguiente ejemplo:

Id          Campo1

1           a,b,c,d

Necesitaba hacer una consulta que me mostrara los valores de la siguiente forma:

Id          Campo1

1          a
1          b
1          c
1          d

“Googleando” encontré este interesante artículo donde explica como usar los niveles (level) y la orden CONNECT BY LEVEL para lograr el propósito buscado. Espero les sea útil como a mi.

¡Saludos!

 

sqldeveloper: MSVCR71.dll is missing.

Me bajé la más reciente versión de sqldeveloper, el sqldeveloper-3.2.09.30.zip, que viene junto con el jdk. En una máquina con el sistema operativo windows 7. Al descomprimirlo y ejecutarlo, éste no arrancaba y me mandaba el error de que no encontraba MSVCR71.dll. Buscando por ahí, encontré varias soluciones. La más sencilla fue copiar el MSVCR71.dll que se encuentra en la ruta <directorio-de-instalacion>/sqldeveloper/jdk/jre/bin al directorio <directorio-de-instalacion>/sqldeveloper/sqldeveloper/bin y listo. Al arrancar nuevamente la aplicación, ésta arrancó sin problemas.