4 Replies Latest reply on Jun 20, 2020 9:58 PM by L. Fernigrini

    Varios UPDATE en un procedimiento

    AlfonsoAlmonte

      Tengo este procedimiento y solo me ejecuta el primer update que esta despues del IF y obvia los demas. Por favor alguien me podria ayudar en que estoy fallando. Comente donde me sucede el inconveniente

       

       

      DECLARE

       

         v_nombre_cliente VARCHAR2(100);

         v_rncTB VARCHAR2(40);

         v_codigo_clienteTB VARCHAR2(10);

         v_codigo_clienteTaveras VARCHAR2(10);

         v_numero_prestamo VARCHAR2(15);

         v_balance NUMBER(13,2);

         v_rncTaveras VARCHAR2(40);

         v_maxidprestamo venta.solicitud_prestamo.NUMERO_FACTURA%type;

        

      CURSOR c_listaClientesTB

          IS

              SELECT c.nombre, c.rnc, c.cliente, t.numero_documento, SUM(t.balance) as balance

                  FROM venta.transacciones_condicion_pago t

                  JOIN venta.cliente c ON (c.cliente = t.cliente)

                  WHERE c.compania = t.compania

                  AND t.compania = 14

                  AND t.zona = 7

                  AND t.balance <> 0

                  AND c.rnc = '001-1647917-1'

              GROUP BY c.nombre, c.rnc, c.cliente, t.numero_documento

              ORDER BY c.nombre, t.numero_documento;

         

       

      CURSOR c_listaClientesTaveras

          IS

              SELECT rnc, cliente

                  FROM venta.cliente

                  WHERE compania = 1

                  AND rnc = v_rncTB

                  AND ruta_cobro = 3;

        

          BEGIN

              FOR prestamos_vigentes IN c_listaClientesTB

             

                  LOOP

                      v_nombre_cliente := prestamos_vigentes.nombre;

                      v_rncTB := prestamos_vigentes.rnc;

                      v_codigo_clienteTB := prestamos_vigentes.cliente;

                      v_numero_prestamo := prestamos_vigentes.numero_documento;

                      v_balance := prestamos_vigentes.balance;

                     

                      select max(NUMERO_FACTURA) into v_maxidprestamo

                      from venta.solicitud_prestamo

                      where compania = 1;

             

                      v_maxidprestamo := v_maxidprestamo + 1;

                     

                      BEGIN

                          FOR rncTaveras IN c_listaClientesTaveras

                              LOOP

                                  v_rncTaveras := rncTaveras.rnc;

                                  v_codigo_clienteTaveras := rncTaveras.cliente;

                                      IF (v_rncTaveras = v_rncTB) THEN

                                       ---Solo ejecuta este update---

                                      update venta.solicitud_prestamo

                                          set compania = 1, zona = 3, numero_solicitud = v_codigo_clienteTaveras, numero_factura = v_maxidprestamo

                                          where COMPANIA = 14

                                          AND CEDULA_SOLICITANTE = v_rncTB

                                          and numero_factura = v_numero_prestamo;

                                    ---No ejecuta los update a partir desde aqui---

                                      update venta.transacciones_condicion_pago

                                          set compania = 1, zona = 3, cliente = v_codigo_clienteTaveras, numero_documento = v_maxidprestamo

                                          where COMPANIA = 14

                                          AND NUMERO_DOCUMENTO IN (v_numero_prestamo)

                                          AND cliente = v_codigo_clienteTaveras;

        

                                      update rebo.recibos_ingresos

                                          set compania = 1, zona = 3, codigo = v_codigo_clienteTaveras, NO_PRESTAMO = v_maxidprestamo

                                          where COMPANIA = 14

                                          AND NO_PRESTAMO = v_numero_prestamo

                                          AND codigo = v_codigo_clienteTaveras;

       

                                      update rebo.comentarios

                                          set compania = 1, documento = v_maxidprestamo, cuenta = v_codigo_clienteTaveras

                                          where COMPANIA = 14

                                          AND documento = v_numero_prestamo

                                          AND cuenta = v_codigo_clienteTaveras;

       

                                          dbms_output.put_line(v_nombre_cliente ||' - '|| v_numero_prestamo ||' - '|| v_maxidprestamo ||' - '|| v_codigo_clienteTaveras ||' - '|| v_codigo_clienteTB ||' - '||v_rncTB );

       

                                      END IF;

       

                              END LOOP;

                      END;

       

       

                  END LOOP;

          END;

        • 1. Re: Varios UPDATE en un procedimiento
          L. Fernigrini

          Revisa esta condición:

              

               AND NUMERO_DOCUMENTO IN (v_numero_prestamo)

           

          Si v_numero_prestamo es una lista de valores, no va a funcionar....

           

          NO los ejecuta o ejecuta y no modifica nada? No es lo mismo.

           

          Podrías poner unos dbms_output entre update y update, mostrando el resultado (SQL%ROWCOUNT) de cada update, algo así como:

           

          dbms_output.put_line('Update 1 - ' || to_char(SQL%ROWCOUNT) );

           

          Si no imprime nada, es porque no se ejecuto el UPDATE (o sea que dio un error en el paso anterior, deberías ver el error)

          Si lo imprime y ROWCOUNT = 0 entonces los filtros que estas aplicando no son correctos.

          • 2. Re: Varios UPDATE en un procedimiento
            Raul.Alvarenga

            Valida los wheres de todos tus updates, deberian poner output para darle secuencia a la ejecución o poner una bitacora de cada paso, tambien podrias validar que las tablas n o tengan triggers con excepciones a NULL que dejen pasar la falla y no te provoque error.

             

            Saludos.

            • 3. Re: Varios UPDATE en un procedimiento
              AlfonsoAlmonte

              De esta forma me funciono el procedimiento, pero ahora es el ultimo update que tiene problemas, he utilizado los parametros correctos y he realizado los select y me trae resultado. Pero en el procedimiento ahora el ultimo update no funciona, no trae datos

               

              DECLARE

               

                 v_nombre_cliente VARCHAR2(100);

                 v_rncTB VARCHAR2(40);

                 v_codigo_clienteTB VARCHAR2(10);

                 v_codigo_clienteTB2 VARCHAR2(10);

                 v_codigo_clienteTaveras VARCHAR2(10);

                 v_numero_prestamo VARCHAR2(15);

                 v_numero_prestamo2 VARCHAR2(15);

                 v_balance NUMBER(13,2);

                 v_rncTaveras VARCHAR2(40);

                 v_maxidprestamo venta.solicitud_prestamo.NUMERO_FACTURA%type;

                

              CURSOR c_listaClientesTB

                  IS

                      SELECT c.nombre, c.rnc, c.cliente, t.numero_documento, SUM(t.balance) as balance

                          FROM venta.transacciones_condicion_pago t

                          JOIN venta.cliente c ON (c.cliente = t.cliente)

                          WHERE c.compania = t.compania

                          AND t.compania = 14

                          AND t.zona = 7

                          AND t.balance <> 0

                          AND c.rnc = '001-1647917-1'

                      GROUP BY c.nombre, c.rnc, c.cliente, t.numero_documento

                      ORDER BY c.nombre, t.numero_documento;

                 

               

              CURSOR c_listaClientesTaveras

                  IS

                      SELECT rnc, cliente

                          FROM venta.cliente

                          WHERE compania = 1

                          AND rnc = v_rncTB

                          AND ruta_cobro = 3;

                         

               

                  BEGIN

                 

                      FOR prestamos_vigentes IN c_listaClientesTB

                     

                          LOOP

                              v_nombre_cliente := prestamos_vigentes.nombre;

                              v_rncTB := prestamos_vigentes.rnc;

                              v_codigo_clienteTB := prestamos_vigentes.cliente;

                              v_numero_prestamo := prestamos_vigentes.numero_documento;

                              v_balance := prestamos_vigentes.balance;

                             

                              select max(NUMERO_FACTURA) into v_maxidprestamo

                              from venta.solicitud_prestamo

                              where compania = 1;

                     

                              v_maxidprestamo := v_maxidprestamo + 1;

                              v_numero_prestamo2 := v_maxidprestamo;

                             

                              BEGIN

                                  FOR rncTaveras IN c_listaClientesTaveras

               

                                      LOOP

                                          v_rncTaveras := rncTaveras.rnc;

                                          v_codigo_clienteTaveras := rncTaveras.cliente;

               

                                              IF (v_rncTaveras = v_rncTB) THEN

               

                                              update venta.solicitud_prestamo

                                                  set compania = 1, zona = 3, numero_solicitud = v_codigo_clienteTaveras, numero_factura = v_maxidprestamo

                                                  where COMPANIA = 14

                                                  AND CEDULA_SOLICITANTE = v_rncTB

                                                  and numero_factura = v_numero_prestamo;

               

                                                  dbms_output.put_line(v_nombre_cliente ||' - '|| v_numero_prestamo ||' - '|| v_maxidprestamo ||' - '|| v_codigo_clienteTaveras ||' - '|| v_codigo_clienteTB ||' - '||v_rncTB );

              dbms_output.put_line('Update 1 - ' || to_char(SQL%ROWCOUNT) );

                                              END IF;

                                             

                                              IF (v_rncTaveras = v_rncTB) THEN

               

                                              update venta.transacciones_condicion_pago

                                                  set compania = 1, zona = 3, cliente = v_codigo_clienteTaveras, numero_documento = v_maxidprestamo

                                                  where COMPANIA = 14

                                                  AND NUMERO_DOCUMENTO IN (v_numero_prestamo)

                                                  AND cliente = v_codigo_clienteTB;

               

                                                  dbms_output.put_line(v_nombre_cliente ||' - '|| v_numero_prestamo ||' - '|| v_maxidprestamo ||' - '|| v_codigo_clienteTaveras ||' - '|| v_codigo_clienteTB ||' - '||v_rncTB );

              dbms_output.put_line('Update 1 - ' || to_char(SQL%ROWCOUNT) );

                                              END IF;

               

                                              IF (v_rncTaveras = v_rncTB) THEN

               

                                              update rebo.recibos_ingresos

                                                  set compania = 1, zona = 3, codigo = v_codigo_clienteTaveras, NO_PRESTAMO = v_maxidprestamo

                                                  where COMPANIA = 14

                                                  AND NO_PRESTAMO = v_numero_prestamo

                                                  AND codigo = v_codigo_clienteTB;

               

               

                                                  dbms_output.put_line(v_nombre_cliente ||' - '|| v_numero_prestamo ||' - '|| v_maxidprestamo ||' - '|| v_codigo_clienteTaveras ||' - '|| v_codigo_clienteTB ||' - '||v_rncTB );

                                              dbms_output.put_line('Update 1 - ' || to_char(SQL%ROWCOUNT) );

                                              END IF;

                                             

                                              IF (v_rncTaveras = v_rncTB) THEN

                                             

                                              update rebo.comentarios

                                                  set compania = 1, cuenta = v_codigo_clienteTaveras, documento = v_maxidprestamo

                                                  where COMPANIA = 14

                                                  AND documento IN (v_numero_prestamo)

                                                  AND cuenta IN (v_codigo_clienteTB);

                                                 

                                              dbms_output.put_line(v_nombre_cliente ||' - '|| v_numero_prestamo ||' - '|| v_maxidprestamo ||' - '|| v_codigo_clienteTaveras ||' - '|| v_codigo_clienteTB ||' - '||v_rncTB );

                                              dbms_output.put_line('Update 1 - ' || to_char(SQL%ROWCOUNT) );

                                              END IF;

                 

                                      END LOOP;

                                     

                              END;

               

                          END LOOP;

                  END;

               

               

              Update 1 - 1

               

              Update 2 - 10

               

              Update 3 - 6

               

              Update 4 - 0

              • 4. Re: Varios UPDATE en un procedimiento
                L. Fernigrini

                Ok, entonces no es que "no se ejecuta" sino que ejecuta pero no modifica filas de la base de datos, lo cual implica que el WHERE que estas usando no es el correcto.

                 

                 

                 

                Que pasa si ejecutas lo siguiente directamente en SQL*Plus, TOAD, SQL Developer o lo que sea que uses para conectarte a la DB:

                 

                SELECT * FROM rebo.comentarios

                where COMPANIA = 14

                AND documento IN (<<Poner el valor de v_numero_prestamo >>)

                AND cuenta IN (<<Poner el valor de v_codigo_clienteTB>>);

                 

                Por ejemplo:

                SELECT * FROM rebo.comentarios

                where COMPANIA = 14

                AND documento IN (232323)

                AND cuenta IN (445566);

                 

                Si devuelve datos pero el update no actualiza nada... seria algo raro. Asegurate que los tipos de datos de las columnas "documento" y "cuenta" sean los correctos, por lo que veo los parámetros son de tipo VARCHAR, podria ser un tema de conversion de tipo de datos. Por ejemplo, si comparas la cadena de texto '05' con el numero 5 pueden pasar dos cosas:

                a) Si Oracle convierte la cadena de texto '05' a un numero, el mismo seria 5, por lo que 5=5 es verdadero.

                b) Si Oracle convierte el numero 5 a una cadena de texto, la misma seria '5', por lo que '5'='05' no es verdadero.

                 

                Esa es una posiblidad, una conversion implicita que no este andando bien.

                 

                Por lo pronto, ejecuta el SELECT tal cual explique y pone tanto el mismo (con los valores de las variables reemplazadas) como el resultado, y la descripcion de la tabla rebo.comentarios para saber el tipo de datos de cada columna.

                 

                 

                1 person found this helpful