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

Oracle—如何改进此PLSQL嵌套循环以检索信息?,sql,oracle,for-loop,plsql,cursors,Sql,Oracle,For Loop,Plsql,Cursors,我正在编写一个复杂的PL/SQL过程,以便在屏幕上显示参数中确定期间的工资详细信息,我编写了第一个循环用于显示每个员工的信息,第二个循环用于显示他们的工资信息,但这两个循环都不显示我可以显示的信息 第一个光标检索有关员工的信息(emp_id、名字、姓氏等) 第二个光标检索有关工资概念的信息(联邦税、社会保障、扣减等) 我想在控制台中显示如下内容: 但我收到的信息是针对每个薪资概念显示的同一名员工。你知道吗?谢谢 我认为必须将dbms_输出放在第二个循环之前,以避免重复打印员工详细信息 试试这个,

我正在编写一个复杂的PL/SQL过程,以便在屏幕上显示参数中确定期间的工资详细信息,我编写了第一个循环用于显示每个员工的信息,第二个循环用于显示他们的工资信息,但这两个循环都不显示我可以显示的信息

  • 第一个光标检索有关员工的信息(emp_id、名字、姓氏等)
  • 第二个光标检索有关工资概念的信息(联邦税、社会保障、扣减等)
  • 我想在控制台中显示如下内容:

    但我收到的信息是针对每个薪资概念显示的同一名员工。你知道吗?谢谢


    我认为必须将dbms_输出放在第二个循环之前,以避免重复打印员工详细信息

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

    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;
    

    我认为必须将dbms_输出放在第二个循环之前,以避免重复打印员工详细信息

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

    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;
    

    你真是个天才!!!!它很好用!!!谢谢你的帮助。我非常感激。我选择了正确的答案!!!你真是个天才!!!!它很好用!!!谢谢你的帮助。我非常感激。我选择了正确的答案!!!您是否使用dbms_输出在屏幕上显示数据?谢谢编辑我的帖子。是的,我终于可以解决这个问题了,但是现在我想编辑我的代码以显示在屏幕上(使用DBMS_输出),就像第一个屏幕截图中显示的一样。我想我应该补充一个新问题。谢谢你的帮助,威廉。你正在用dbms_输出在屏幕上显示数据吗?谢谢你编辑我的帖子。是的,我终于可以解决这个问题了,但是现在我想编辑我的代码以显示在屏幕上(使用DBMS_输出),就像第一个屏幕截图中显示的一样。我想我应该补充一个新问题。谢谢你的帮助,威廉。