Oracle - 如何改进此PLSQL嵌套循环以检索信息?

时间:2017-05-27 15:10:55

标签: sql oracle for-loop plsql cursors

我正在编写一个复杂的PL / SQL过程,在屏幕上显示有关参数确定时段的工资明细的信息,我写了第一个循环来显示每个员工的信息,第二个循环显示有关他们的信息。工资,但两个循环都不显示我可以显示的信息。

  1. 第一个Cursor检索有关员工的信息(emp_id,名字,姓氏等)
  2. 第二个Cursor检索有关工资概念的信息(联邦税,社会保障,扣除等)
  3. FOR i IN (SELECT   a.legajo, a.apellido, a.nombre, 
                       formatear_cuit_cuil(a.cuil) CUIL, a.fecha_alta, 
                       b.numero, b.fecha_liquidacion, b.sueldo_basico,
                       b.codigo_periodo_liq
              FROM     empleados a
              JOIN     liquidaciones b
              ON       (a.legajo = b.legajo_empleado)
              WHERE    b.fecha_liquidacion = v_fecha_liq
              ORDER BY a.apellido, a.nombre ASC)
    LOOP
        FOR j IN (SELECT b.descripcion CONCEPTO, a.cantidad,
                         (CASE
                              WHEN c.descripcion LIKE 'HABER' THEN
                                   a.importe
                              ELSE
                                   NULL
                              END
                         ) haberes,
                         (CASE
                              WHEN c.descripcion = 'ANTICIPO'
                              OR c.descripcion = 'RETENCION' THEN
                                   a.importe
                              ELSE
                                   NULL
                              END
                         ) retenciones
                  FROM   detalles_liquidaciones a
                  JOIN   conceptos b
                  ON     (a.codigo_concepto = b.codigo)
                  JOIN   tipos_conceptos c
                  ON     (b.codigo_tipo = c.codigo)
                  WHERE  a.numero_liquidacion = i.numero
                  AND    c.descripcion IN ('HABER', 'RETENCION', 'ANTICIPO'))
        LOOP        
            DBMS_OUTPUT.PUT_LINE(
                'Empleado: ' || LPAD(i.legajo, 4, 0) || ' - ' || 
                UPPER(i.apellido) || ', ' || UPPER(i.nombre));
    
            DBMS_OUTPUT.PUT_LINE('CUIL: ' || i.cuil);
    
            DBMS_OUTPUT.PUT_LINE(
                RPAD('Concepto', LENGTH(j.concepto), ' ') ||
                        ' Haberes' || ' Retenciones'); 
    
            DBMS_OUTPUT.PUT_LINE(j.concepto);
    

    我想在控制台中显示类似的内容:enter image description here

    但是我收到了针对每个薪资概念显示的同一员工的信息。你有什么主意吗?感谢

    enter image description here

1 个答案:

答案 0 :(得分:2)

我认为您必须在第二个循环之前放置dbms_output以避免重复打印员工详细信息

尝试这个,让我知道它是否有效

FOR i IN (SELECT a.legajo, a.apellido, a.nombre, formatear_cuit_cuil(a.cuil) CUIL, 
    a.fecha_alta, b.numero, b.fecha_liquidacion, b.sueldo_basico, b.codigo_periodo_liq 
    FROM empleados a 
    JOIN 
    liquidaciones b 
    ON (a.legajo = b.legajo_empleado) 
    WHERE b.fecha_liquidacion = v_fecha_liq 
    ORDER BY a.apellido, a.nombre ASC) 
    LOOP


                    DBMS_OUTPUT.PUT_LINE(
                        'Empleado: ' || LPAD(i.legajo, 4, 0) || ' - ' || 
                        UPPER(i.apellido) || ', ' || UPPER(i.nombre));

                    DBMS_OUTPUT.PUT_LINE('CUIL: ' || i.cuil);

                FOR j IN (SELECT b.descripcion CONCEPTO, a.cantidad,
                                 (CASE
                                        WHEN c.descripcion LIKE 'HABER' THEN
                                            a.importe
                                        ELSE
                                            NULL
                                  END
                                  ) haberes,
                                 (CASE
                                        WHEN c.descripcion = 'ANTICIPO'
                                             OR c.descripcion = 'RETENCION' THEN
                                            a.importe
                                        ELSE
                                            NULL
                                        END
                                  ) retenciones
                          FROM   detalles_liquidaciones a
                          JOIN   conceptos b
                          ON    (a.codigo_concepto = b.codigo)
                          JOIN   tipos_conceptos c
                          ON    (b.codigo_tipo = c.codigo)
                          WHERE  a.numero_liquidacion = i.numero
                          AND    c.descripcion IN ('HABER', 'RETENCION', 'ANTICIPO'))
                LOOP


                    DBMS_OUTPUT.PUT_LINE(
                        RPAD('Concepto', LENGTH(j.concepto), ' ') ||
                        ' Haberes' || ' Retenciones'); 

                    DBMS_OUTPUT.PUT_LINE(j.concepto);

        END LOOP;
        END LOOP;