Thread: No funciona WITH con mas de 2 sentencias DML

No funciona WITH con mas de 2 sentencias DML

From
Hellmuth Vargas
Date:


Hola Lista 

Estaba realizando un cargue de un archivo Excel con información de clientes bancarios con tarjeta para un call center poblando un modelo maestro, detalle  y tabla de llamadas telefónicas. En un principio se implemento por medio de una herramienta de ETL con los controles que ofrece la herramienta ETL y para bases de 10.000 registros duraba hasta 3 horas si no se caída por memoria, por lo tanto me lo asignaron para optimizarlo y decidí realizar  las operaciones de ordenamiento, limpieza y filtro de datos  directamente en la base de datos (donde es natural) aun empleando el cascaron de la herramienta de ETL (pues debe integrase con otro sistema); dentro de uno de los pasos, ya para insertar  los datos en las diferentes tablas, implemente un código similar al siguiente empleando WITH:


WITH base AS (
INSERT INTO maestro (
            fechacreacion, fechamodificacion, idusuariocrea,
            departamento, documento, municipio, primerapellido, 
            primernombre,  telefono1,  tipodocumento, direccion, email)
SELECT now(), now(), 1,a.departamento ,a.documento,a.ciudad, a.apellidos,a.nombres, a.telefono_1, a.tipo_identificacion,a.direccion_residencia , a.e_mail 
FROM  tmp_carga 
GROUP BY a.departamento ,a.documento,a.ciudad, a.apellidos,a.nombres, a.telefono_1, a.tipo_identificacion,a.direccion_residencia , a.e_mail 
RETURNING id,documento

), insertadetalle AS (
INSERT INTO detalle(
            codigooficina, 
   direccionoficina, franquicia, montodisponible, nombreproducto, tipoproducto, ultimosdigitos, maestro_id)

   SELECT a.Codigo_Interno, a.Cod_Oficina,a.DireccionOficina,a.Franquicia_tarjeta, a.MontoDisponible,
            a.Nombre_Producto,a.Tipo_Producto,a.ultimos_digitos_tc,b.id
FROM vys.tmp_carga as a 
JOIN base as b on a.documento=b.documento 
RETURNING maestro_id

)
INSERT INTO
marcadortelefonia
(
numerointento,
telefono,
telefono2,
telefono3,
telefono4,
fechacreacion,
maestro_id,
calificacion
)
SELECT
1,
a.telefono1,
a.telefono2,
a.telefono3,
a.telefono4,
current_timestamp,
0
FROM
maestro as a 
    JOIN base as b --tambien probe sustituyendo base por insertadetalle y tampoco
    ON a.id=b.id



El tema es que no ejecuta el ultimo INSERT (sobre marcadortelefonia): si inserta los datos en maestro y en  detalle, pero cuando consulto sobre marcadortelefonia no hay nada y tampoco genera error. En resumen, no sirve emplear  un WITH con mas de dos sentencias DML.? o estoy haciendo algo mal?  de antemano muchas gracias lista

Cordialmente,

Ing. Hellmuth I. Vargas S.

Re: [pgsql-es-ayuda] No funciona WITH con mas de 2 sentencias DML

From
Alvaro Herrera
Date:
Hellmuth Vargas escribió:
> Hola Lista
>
> Estaba realizando un cargue de un archivo Excel con información de clientes
> bancarios con tarjeta para un call center poblando un modelo maestro,
> detalle  y tabla de llamadas telefónicas. En un principio se implemento por
> medio de una herramienta de ETL con los controles que ofrece la herramienta
> ETL y para bases de 10.000 registros duraba hasta 3 horas si no se caída
> por memoria, por lo tanto me lo asignaron para optimizarlo y decidí
> realizar  las operaciones de ordenamiento, limpieza y filtro de datos
>  directamente en la base de datos (donde es natural) aun empleando el
> cascaron de la herramienta de ETL (pues debe integrase con otro sistema);
> dentro de uno de los pasos, ya para insertar  los datos en las diferentes
> tablas, implemente un código similar al siguiente empleando WITH:

Hmm, yo creo que sí funciona y no lo estás usando bien.  No tengo tiempo
ahora para mirar tu query, pero me parece raro que en el FROM no hagas
referencia a insertadetalle, y también me parece raro que hagas
referencia directa a maestro cuando deberías hacerlo a base.

--
Álvaro Herrera                http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services