El problema
Muchas veces nos vemos en la necesidad de invocar un Web Service directamente desde la base de datos.
La utilización de Java dentro de la base de datos no siempre es una opción disponible, así que tuve que buscar una solución que sólo utilizara código PL/SQL.
La solución
Podemos utilizar el package UTL_HTTP para hacer los request SOAP directamente al servidor destino, esto si bien es más complicado que utilizar las clases proxy, nos evita tener que cargar Java en la base de datos.
La forma de invocar el package UTL_HTTP es la siguiente:
El problema
Luego de instalar el nuevo SQL Developer de Oracle, me di cuenta de que no me podía conectar a ninguna base de datos, el error rezaba:
ORA-00604: se ha producido un error a nivel 1 de SQL recursivo ORA-12705: No se puede acceder a los archivos de datos NLS o se ha especificado un entorno no válido.
La solucion
Hay que editar el archivo "sqldeveloper.conf" y agregarle las siguientes lineas:
AddVMOption -Duser.region=us AddVMOption -Duser.language=en
Listo! una vez hecho esto pude conectarme sin problemas.
Espero que les sirva, saludos!
El problema
A veces nos encontramos con la necesidad de poder "loguear" el acceso a base de datos de una aplicación, por desgracia no todas las aplicaciones cuentan con esta funcionalidad, o si la poseen, no siempre cumplen todas nuestras espectativas.
La solución
Por suerte existe una forma de "loguear" el acceso a bases de datos Oracle y "espiar" lo que hace la aplicación. Esta solución consiste en utilizar un desarrollo de Sergey Sikorskiy:
http://www.geocities.com/ocispy/
Para poder utilizar esta excelente herramienta debemos:
- copiar el archivo "ocispy8i.dll" al directorio ORACLE_HOME/bin
- copiar el archivo "ocispy.cfg" a nuestro directorio raiz, por ejemplo "C:\ocispy.cfg"
- y por ultimo setear la variable de entorno ORA_OCI_UCBPKG a "ocispy8i" (set ORA_OCI_UCBPKG=ocispy8i).
Listo! con eso ya podemos empezar a loguear nuestra aplicacion.
Conclusión
Esta herramienta nos permite de una manera rapida y sencilla realizar un trace de cada aplicación que haga uso el cliente OCI de Oracle. Pueden revisar las opciones a incluir en el archivo "ocispy.cfg" y ajustarlo a sus necesidades.
Si alguna vez se han preguntado como hacer para copiar información (y rapidamente!) desde una base de datos a otra acá les dejo el comando de SQL*Plus para poder hacerlo:
COPY FROM "db_origen" TO "db_destino" "accion" "tabla_destino" ["(column_name, column_name...)"] USING "query";
Siendo:
-
"db_origen" y "db_destino" - las conexiones a las base de datos, por ejemplo: SCOTT/TIGER@BASE1
-
"accion" - puede ser una de las siguientes:
-
create - Crea la tabla. Si esta ya existía vamos a tener un error al ejecutar el comando.
-
replace - Reemplaza la tabla si existía y la vuelve a crear. Si no existía, la crea e inserta los datos.
-
insert - Inserta los datos provenientes de la query. En este caso solo las filas devueltas por la query son insertadas, no hay ninguna operación de DDL. Si la tabla no existía vamos a tener un error al ejecutar el comando.
-
append - Inserta los datos si la tabla ya existía. Si la tabla no existía entonces la crea y luego procede a insertar las filas.}
-
-
"tabla_destino": La tabla destino :P
-
["(column_name, column_name...)"] - Opcional. Permite establecer en que columnas queremos insertar los datos. Esto debe usarse cuando el query solo va a devolver algunas de las columnas de la tabla destino y no todas.
-
"query" - Query a ejecutarse en la base origen.
Ejemplos de uso:
Algunas veces es necesario utilizar caracteres especiales en alguna query que utilicemos en SQL*Plus.
Un problema común es el de la comillas simples ('):
SQL> INSERT INTO tmp_table (texto) VALUES ('Johnson's house'); ERROR: ORA-01756: quoted string not properly terminated
Si queremos insertar una comilla simple solo debemos ponerla doble:
SQL> INSERT INTO tmp_table (texto) VALUES ('Johnson''s house'); 1 ROW created.