Oracle - 如何改进此 PLSQL 嵌套循环以检索信息?
Oracle - How can I improve this PLSQL nested loop to retrieve information?
我正在编写一个复杂的 PL/SQL 程序来在屏幕上显示参数确定期间的工资详细信息,我编写了第一个循环来显示有关每个员工的信息,第二个循环用于显示有关他们薪水的信息,但两个循环都不显示我可以显示的信息。
- 第一个游标检索有关员工的信息(emp_id、名字、姓氏等)
- 第二个 Cursor 检索有关工资概念的信息(联邦税、社会保障、扣除等)
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 放在第二个循环之前以避免重复打印员工详细信息
试试这个,如果有效请告诉我
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;
我正在编写一个复杂的 PL/SQL 程序来在屏幕上显示参数确定期间的工资详细信息,我编写了第一个循环来显示有关每个员工的信息,第二个循环用于显示有关他们薪水的信息,但两个循环都不显示我可以显示的信息。
- 第一个游标检索有关员工的信息(emp_id、名字、姓氏等)
- 第二个 Cursor 检索有关工资概念的信息(联邦税、社会保障、扣除等)
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 放在第二个循环之前以避免重复打印员工详细信息
试试这个,如果有效请告诉我
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;