2017-05-27 71 views
0

我正在编写一个复杂的PL/SQL过程,以在屏幕上显示有关从参数确定的期间的工资细节的信息,并且我已经编写了第一个循环来显示关于每个员工的信息,第二个循环显示了有关他们工资的信息但是两个循环都不显示信息,因为我可以显示。Oracle - 如何改进这个PLSQL嵌套循环来检索信息?

  1. 第一光标检索有关雇员(EMP_ID,姓,名等)的信息
  2. 第二光标检索有关工资的概念(联邦税收,社会保障,扣除额等)
信息
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

你使用dbms_output在屏幕上显示数据? –

+0

感谢您编辑我的帖子。是的,最后我可以解决这个问题,但现在我想要编辑我的代码以便在屏幕上显示(使用DBMS_OUTPUT),就像在第一个屏幕截图中看到的一样。我想我应该添加一个新问题。感谢您的帮助William。 –

回答

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; 
+0

你是一个天才的人!它工作正常!谢谢你的帮助。我非常感激。我选择了你的答案吧! –