【问题标题】:Oracle - How can I improve this PLSQL nested loop to retrieve information?Oracle - 如何改进此 PLSQL 嵌套循环以检索信息?
【发布时间】:2017-05-27 15:10:55
【问题描述】:

我正在编写一个复杂的 PL/SQL 过程,以根据参数在屏幕上显示有关确定时期内工资详细信息的信息,并且我编写了第一个循环来显示每个员工的信息,并编写了第二个循环来显示关于他们的信息薪水,但两个循环都没有显示我可以显示的信息。

  1. 第一个 Cursor 检索有关员工的信息(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);

我想在控制台中显示类似的内容:

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

【问题讨论】:

  • 您是否使用 dbms_output 在屏幕上显示数据?
  • 感谢您编辑我的帖子。是的,最后我可以解决问题,但现在我想编辑我的代码以在屏幕上显示(使用 DBMS_OUTPUT),就像在第一个屏幕截图中一样。我想我应该添加一个新问题。感谢您的帮助威廉。
  • 第二次投反对票。我看不到那些图像。

标签: sql oracle for-loop plsql cursors


【解决方案1】:

我认为您必须将 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;

【讨论】:

  • 你是个天才!!!!它工作正常!谢谢你的帮助。我非常感激。我选对了你的答案!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 2021-05-02
  • 2017-01-06
  • 1970-01-01
相关资源
最近更新 更多