En muchas ocasiones tenemos que automatizar, de alguna manera, alguna tarea de mantenimiento o actualización en nuestra base de datos. Cuando trabajamos con Oracle, muy recomendable la versión Express de esta base de datos, tenemos a nuestra disposición Shell Scripting para ejecutar comandos a través de un archivo de procesamiento por lotes (batch) para Windows. Nos vamos a centrar en este sistema operativo ya que es actualmente el sistema operativo más utilizado en todo el mundo. Vamos a implementar nuestro primer Shell Script con Oracle que nos permita guardar en un fichero txt una copia de seguridad de una tabla.
Lo primero que tenemos que tener en cuenta es crear la tabla, aquí os dejamos como podéis crear la tabla de prueba.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
CREATE TABLE NESTUSE.TABLA1 ( ID NUMBER NOT NULL, NOMBRE VARCHAR2(150), APELLIDOS VARCHAR2(150), FECHA DATE ) RESULT_CACHE (MODE DEFAULT) STORAGE ( BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT ) LOGGING NOCOMPRESS NOCACHE NOPARALLEL NOMONITORING; ALTER TABLE NESTUSE.TABLA1 ADD ( CONSTRAINT TABLA1_PK PRIMARY KEY (ID) ENABLE VALIDATE); |
Una vez creada la rellenamos con datos, aquí también os dejamos los inserts necesarios para tener algo de datos.
1 2 3 4 5 6 7 8 9 |
INSERT INTO TABLA1 (ID,NOMBRE,APELLIDOS,FECHA) VALUES (1,'Luis', 'del Valle',SYSDATE); INSERT INTO TABLA1 (ID,NOMBRE,APELLIDOS,FECHA) VALUES (2,'Alfonso', 'Contreras',SYSDATE-1); INSERT INTO TABLA1 (ID,NOMBRE,APELLIDOS,FECHA) VALUES (3,'Juan', 'Añón',SYSDATE-2); INSERT INTO TABLA1 (ID,NOMBRE,APELLIDOS,FECHA) VALUES (4,'Luis Fernando', 'Valera',SYSDATE-3); commit; |
Por lo tanto ya tenemos nuestra tabla y también tenemos nuestros datos así que vamos a crear un archivo en cualquier editor de textos que se va a llamar backup_tabla1.bat. Dentro de este archivo copiamos el siguiente texto y guardamos.
1 |
sqlplus /nolog @C:\backup_tabla1_inserts.sql |
En el archivo batch lo que estamos haciendo es decir al sqlplus, el programa que permite ejecutar SQL y PL/SQL por línea de comandos de Oracle, que se conecte con cualquier usuario (/nolog) y ejecute el script que está en C:\backup_tabla1_inserts.sql. Hay que remarcar que todavía no nos hemos conectado. La conexión se realiza en el propio script que ahora veremos.
Ahora creamos el archivo backup_tabla1_inserts.sql, comiámos el siguiente código y guardamos en C:\. Es importante guardarlo en la raíz de C: debido a que en el archivo batch estamos haciendo referencia a este archivo .sql que está en C:\backup_tabla1_inserts.sql. Si lo guardamos en otra ubicación deberíamos cambiar el batch y poner la nueva ubicación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
-- Conectamos con nuestra base de datos, ya estamos dentro del sqlplus -- Hay que escribir el usuario y contraseña CONNECT usuario/contraseña -- Activamos la salida por el output para poder capturar dbms_output.put_line set serveroutput on -- Marcamos que no nos notifique de las acciones que va ejecutando para no ensuciar -- el resultado como por ejemplo "PL/SQL procedure successfully completed" SET FEEDBACK OFF -- Activamos el SPOOL que permite capturar lo que enviamos al output -- y almacenarlo en un archivo SPOOL C:\backup_tabla1.sql -- Cramos un bloque de PL/SQL que nos pinte las inserts DECLARE sentencia VARCHAR2 (20000) := ''; BEGIN -- Comenzamos creando nuestro script de recuperación será -- un bloque de PL/SQL sentencia := 'DECLARE' || CHR (13); sentencia := sentencia || 'BEGIN' || CHR (13); --Recorremos la tabla1 FOR xx IN ( SELECT ID, NOMBRE, APELLIDOS, FECHA FROM tabla1 ORDER BY 1 ASC) LOOP -- Creamos la sentencia insert y las vamos almacenando en la variable setencia -- Hay que concatenar cada insert -- Para que quede más ordenado al final de cada línea hacemos un salto de línea CHR (13) sentencia := sentencia || 'Insert into tabla1(ID, NOMBRE, APELLIDOS, FECHA) Values '; sentencia := sentencia || '(''' || xx.ID || ''', ''' || xx.NOMBRE || ''', ''' || xx.APELLIDOS || ''', ''' || xx.FECHA || ''');' || CHR (13); END LOOP; -- Finalizamos nuestro bloque de PL/SQL sentencia := sentencia || 'END;' || CHR (13); -- Mostramos por el output el resultado DBMS_OUTPUT.put_line (sentencia); END; -- Esta barra ejecuta el bloque de PL/SQL que hemos creado / -- Salimos EXIT; |
Pues ya tenemos todo lo necesario y si lo hemos configurado bien al ejecutar el archivo backup_tabla1.bat tendremos de resultado otro archivo que está en C:\backup_tabla1.sql con las inserts de esa tabla.
Esto puede ser muy útil cuando tenemos que migrar de un modelo de datos a otro y necesitamos insertar ciertos datos en tablas de diferentes modelos, también nos sirve para automatizar copias de seguridad de algunos datos mediante el gestor de tareas de Windows por ejemplo y, en definitiva, para cualquier tarea que se os ocurra.