miércoles, 30 de septiembre de 2009

INCURSIONANDO EN PLSQL (ORACLE 10g)

En la empresa donde trabajo, terminamos hace poco una implementación de una plataforma para la administración de Call Centers.
Esta plataforma se llama CCA y es de Oracle.

Mi responsabilidad en el proyecto era la integración con el sistema CRM con el que actualmente trabajamos.

Una de las partes fue la actualización de la base de datos y debiamos hacerlo sin que la tabla se quede en 0 en ningun momento, ya que esta tabla es con la que consulta la plataforma para que el cliente ingrese al sistema.

A continuación vamos a explicar la lógica y el mecanismo ya que puede servir para otras aplicaciones:

ORACLE TO ORACLE:

1) Dentro de CCA creamos un DBLINK a la vista de nuestro CRM.
2) Dentro de CCA creamos la tabla IVR_CLIENTES (esta será la que contenga los datos que traigamos de nuestro CRM.
3) Dentro de CCA creamos una tabla IVR_CLIENTES_TMPO, la misma se utilizará de temporal.
4) Para actualizar cada 2 horas básicamente teníamos que armar un plsql que modifique el nombre de las tablas y evite tener que borrar los datos para cargarlos nuevamente (lo que generaría un vacio con posibles error de autentificación).

creamos un archivo ejecuta.sql.

adentro ponemos el siguiente codigo:
Obviar comentarios en rojo, son solo para indicar que se hizo.

Declaro variables
DECLARE
c_registros_A NUMBER(10);
c_registros_B NUMBER(10);
sql_drop VARCHAR2(255);
sql_alter VARCHAR2(255);
sql_create VARCHAR2(255);
sql_truncate VARCHAR2(255);
Hago un insert into select, consiste en hacer un insert en base a un select a otra tabla, en este caso un dblink con el formato CLIENTES_CRM_VIEW@TFLP

BEGIN
INSERT INTO IVR_CLIENTES_TMPO SELECT * FROM IVR_CLIENTES_CRM_VIEW@TFLP;
Básicamente aca cuento los registros, teniendo en cuenta que esta base siempre debe crecer y jamás tener menos registros.
SELECT COUNT(*) INTO c_registros_A FROM IVR_CLIENTES;
SELECT COUNT(*) INTO c_registros_B FROM IVR_CLIENTES_TMPO;
Analizo si me traje mas registros que los que hay ahora.
IF c_registros_B >= c_registros_A THEN
Si es así borro la tabla anterior y modifico el nombre de la vieja.
sql_drop := 'DROP TABLE IVR_CLIENTES';
sql_alter := 'ALTER TABLE IVR_CLIENTES_TMPO RENAME TO IVR_CLIENTES';
Creo nuevamente la base temporal para la próxima corrida.
sql_create := 'CREATE TABLE IVR_CLIENTES_TMPO AS SELECT * FROM IVR_CLIENTES';
Le borro el contenido.
sql_truncate := 'TRUNCATE TABLE IVR_CLIENTES_TMPO';
Ejecuto los comandos.
EXECUTE IMMEDIATE sql_drop;
EXECUTE IMMEDIATE sql_alter;
EXECUTE IMMEDIATE sql_create;
EXECUTE IMMEDIATE sql_truncate;
IMPORTANTE EL COMMITTTTTTT !!!!!!
COMMIT;
END IF;
END;
/

finalmente otro archivo que lo ejecute (utilizando sqlplus):

replica.sh

#!/bin/bash

sqlplus -l REP_10CRM/password@ORCL @ejecuta.sql <
EXIT

y lo croneamos:

[oracle@cca-db1 ~]$ crontab -l
* */1 * * * /bin/sh /home/oracle/replica.sh

Hernán Mazzeo

No hay comentarios:

Publicar un comentario