Para poder exportar información desde una base de datos Oracle, lo conveniente es usar SQL*Plus desde la linea de comandos.
Este producto que viene incluido con el cliente Oracle, nos permite desde linea de comandos ejecutar comandos SQL y lo mejor de todo es que es muy útil para ser usado en scripts.
La exportación de los datos la podemos realizar siguiendo distintos formatos destinos, entre los cuales los más populares son: CSV (Comma Separated Values), texto plano separado por "|" (pipe) y texto plano separado por tab.
Lo que cambia entre ellos es el separador que se use para delimitar las columnas que hayamos consultado.
Exportar a CSV:
El problema
Hace poco tiempo me encontre con el siguiente mensaje de error en SQLPLUS*:
ORA-06502: PL/SQL: numeric or value error: host bind array too small
Este error surgía de querer ejecutar un PL/SQL que hacia uso de dbms_output.put_line. Lamentablemente el mensaje de error no indicaba la linea del problema y tampoco había demasiada información en Internet sobre ello, y lo peor de todo es que en otra PC el mismo PL/SQL andaba de maravillas!
La solución
Al ejecutar el PL/SQL en la otra PC me di cuenta de que tenía instalado una versión más nueva del cliente de Oracle SQL*Plus: Release 10.2.0.1.0 y que nuestra base de datos es una Oracle 10G R2 version 10.2.0.2.0.
Sin embargo en mi PC tenía el cliente 10.1.0.1.0, asi que desinstalé el cliente e instalé la versión 10.2 del cliente y "mágicamente" el problema se solucionó!
Espero que les haya servido!!
Saludos!
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.