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:
Podriamos crear una tabla desde la base DB1 en la base DB2 con el siguiente comando:
SQL> copy FROM scott/tiger@DB1 TO scott/tiger@DB2 CREATE emp using SELECT * FROM emp;
Este comando también sirve para poder copiar información desde una tabla a otra en la misma base:
SQL> copy FROM scott/tiger@DB1 TO scott/tiger@DB1 CREATE new_emp using SELECT * FROM emp;
Conclusión:
Vale destacar que este método es muy práctico para copiar tablas con columnas con tipo de datos: BLOB, CLOB o Long.
Si en nuestra base de datos tenemos columnas Long utilizadas para almacenar texto, deberiamos tener en cuenta el tamańo de los datos Long a copiar. Ejecutamos el siguiente comando "longsize" con el tamańo deseado (en bytes) y listo:
SQL> SET longsize 35000
Otro modificador util es el "copycommit", el cual permite establecer cada cuantas filas insertadas se va a ejecutar un commit:
SQL> SET copycommit 5000
Espero que les haya sido de utilidad!
Hola.
Con un replace elimina todos los datos de la tabla destino, o sólo elimina los registros de la query del using?
Es decir, me interesa copiar registros de una tabla origen a una destino, de manera que si el registro no existe en destino se inserta, pero si ya existe el registro entonces se updatea…
Aprovecho para felicitar por el manual.
Un saludo!
Muy buenos los apuntes con respecto al comando COPY , la pregunta es como copio ademas de las tablas las funciones, las vistas, los procedimientos etc etc etc.
Gracias de antemano por sus comentarios.
hola. tengo una pregunta al respecto. tengo una tabla con un atributo long raw y al realizar un query select * from “mi_tabla”; me manda un 1 o un 2 en ese campo. no se como recuperarlo. lo pasé a una tabla donde en lugar de ser un long raw es un blob con to_lob(compo_long_raw) y ahora recibo al ejecutar el query select * from “mi_tabla_2″; unas cadenas en hexadecimal. lo que guardo es texto de 2Gb en esa columna pero ahora no se como recuperar lo que está en ella…
de antemano gracias…
daniel enciso.
21 años
Me podrias orientar sobre este error, soy newbie en Oracle, saludos
SQL> copy FROM USR/PSW@DBORIGEN TO USR2/PSW@DBDESTINO REPLACE USR.TABLA1 using SELECT * FROM USR2.TABLA1;
Array fetch/bind size is 15. (arraysize is 15)
Will commit after every 10 array binds. (copycommit is 10)
Maximum long size is 4096. (long is 4096)
CPY-0012: Datatype cannot be copied
¿Que tipos de datos tiene tu tabla? Tené en cuenta que el comando COPY solo soporta los siguientes tipos de datos:
CHAR
DATE
LONG
NUMBER
VARCHAR2
Saludos!!
Buenas noches como haria para que en mi otra instancia se refleje los cambio que hago en la estructura de una tabla, es decir, si yo modifico en una instancia la estructura de mi tabla kiero ke automaticamente se refleje ese cambio en otra instancia. Gracias
gande master, me salvaste el dia…. solo una duda, ¿esto mismo sirve para mover datos hacia otra INSTANCIA de MOTOR oracle o solamente entre bases de datos que esten en la misma INSTANCIA?, gracias….
Fijate en el primer ejemplo donde se conecta a una segunda instancia para copiar datos. Esto es indistinto de si están corriendo bajo el mismo servidor. Lo importante es que tengas configurador correctamente el tnsnames desde donde ejecutes el sqlplus.
Saludos!!
scott/tiger@DB1
scott/tiger@DB2
db1 y db2 son las instancias, gracias, solo otra duda, yo trabajo con toad, la configuración del tnsnames.ora es indistinta para toad como para sql puls??? quiero decir: tengo configurado el tnsnames, deberia funcionar bien sobre toad y sql plus???
gracoas…
Lamentablemente el comando COPY es exclusivo de SQLPLUS, lo que podés hacer si queres es escribir en el Toad y luego desde el menú “Editor” -> “Execute SQL via SQL*PLUS” ejecutarlo.
Saludos!!
Necesito cachar en log de salida, los posibles errores que se pudieran presentar cuando se hacen las copias de las tablas entre esquemas, me podrias ayudar con algun pequeño script de como podria hacerlo…. gracias.
Buenas !! Estoy intentando utilizar el comando este pero me da un error al intentar ejecutar:
ORA-06550: línea 6, columna 6:
PLS-00103: Se ha encontrado el símbolo “FROM” cuando se esperaba uno de los siguientes:
:= . ( @ % ;
¿Por que puede ser? El comando lo escribo tal y como aparece arriba….
Muchas gracias de antemanos y un saludete !!
Necesito copiar los datos de una tabla a otra, los datos son de tipo long raw (imágenes), sigo tu procedimiento indicado pero solamente se copia una pequeña parte de la imagen, esto es configurando:
set long 4000
sobre los 4kb me aparece el error:
ORA-01461: can bind a LONG value only for insert into a LONG column.
He generado un procedimiento para hacer un select y luego un insert pero tampoco funciona, devuelve el error:
ora-01406 fetched column value was truncated
La base de datos es 9i,
Agradezco de antemano si me puedes colaborar
Verny, te sugiero establecer el long size en un valor mayor.
Si las imagenes a copiar pesan 4kb y la columna tiene ese tamaño, debería ser suficiente con poner:
set long 4096
Y si eso no funciona puedes probar con poner el límite máximo del parámetro:
set long 2000000000
Saludos!
Gracias por tu colaboración
El problema radica en que si establezco un long mayor a 4000 da el error ORA-01461: can bind a LONG value only for insert into a LONG column
(ej: set long 5000)
También probé haciendo un procedimiento que haga un select y luego un insert pero tampoco funciona, me da el error ORA-01406: fetched column value was truncated
Gracias de nuevo
Verny, ¿podrías incluir el comando que estás usando para ejecutar el copy?
¿La tabla destino ya existe? o ¿estas usando en modo create/replace?
Saludos!
muy bueno pero tengo una pregunta como puedo ejecutar un paquete de una base de datos diferente a la que estoy en oracle??
Cristian, lo que podes usar es un db link y con ello ejecutar localmente un package que está alojado en otra base de datos.
Saludos!!
Excelente, me fue de suma utilidad! Gracias.