Yahoo Answers is shutting down on May 4th, 2021 (Eastern Time) and beginning April 20th, 2021 (Eastern Time) the Yahoo Answers website will be in read-only mode. There will be no changes to other Yahoo properties or services, or your Yahoo account. You can find more information about the Yahoo Answers shutdown and how to download your data on this help page.

¿cómo le paso el resultado de un cursor como parámetro a un Procedimiento almacenado en PL/SQL?

Tengo un código que se ejecuta para un sólo registro (where registro = 1) y necesito que se consulte para todos cada uno de los registros de esa tabla pasándoselo como parámetro.

¿Cómo lo declaro y cómo lo llamo?

Lo estoy haciendo con un procedimiento almacenado

digamos que tengo un procedimiento almacenado que contiene un cursor que trae los numeros de empleado:

CREATE OR REPLACE PROCEDURE usuario.SP_PRUEBA

IS

BEGIN

dbms_output.enable;

DECLARE

CURSOR c_TraeIdEmpleado

IS

select n_num_empleado

from t_PERSONAL

WHERE D_BAJA IS NULL;

BEGIN

FOR v_reg in c_TraeIdEmpleado

LOOP

dbms_output.put_line ( Num_Empleado: || v_reg.n_num_empleado);

end loop;

end;

END SP_PRUEBA;

/

y tengo un Query que dice

SELECT COUNT(*) FROM TB_FALTAS --AUSENCIAS

where N_STATUS=4

and N_TIPO_AUSENCIA=5

AND N_NUM_EMPLEADO = 103

AND to_date( 01/01/2015 , dd/mm/yyyy ) BETWEEN d_fecha_inicio

AND d_fecha_final

AND NOT EXISTS (SELECT n_id_vacacion FROM tb_vacaciones WHERE to_date( 01/01/2015 , dd/mm/yyyy ) BETWEEN d_fecha_inicio AND d_fecha_final

AND n_num_empleado = 103 and N_STATUS=4 )

AND NOT EXISTS (SELECT n_id_ausencia FROM TB_FALTAS --AUSENCIAS WHERE to_date( 01/01/2015 , dd/mm/yyyy ) BETWEEN d_fecha_inicio

AND d_fecha_final

and n_tipo_ausencia <> 5

and n_status = 4

AND n_num_empleado = 103)

Necesito que en lugar del 103, tome el resultado del cursor de arriba

2 Answers

Rating
  • 6 years ago
    Favorite Answer

    No es posible ejecutar un SP en un query, pero como yo lo veo no es necesario, puedes usar un subquery en el where de tu consulta de abajo en lugar de hacer "n_num_empleado = 10" puedes reemplazarlo con la condición IN: "n_num_empleado IN (query del stored procedure)". Completo:

    http://pastebin.com/vLUneZwx

    La condición IN te permite los valores coincidan con los valores que te arroja la subconsulta a manera de OR con cada uno de los elementos que te devuelva.

    Extra: creo que tu consulta podría ser mas optima, en lugar de exists puedes usar joins para no repetir condiciones (no estoy seguro del todo, ya que no puedo hacer pruebas).

  • 6 years ago

    Te agradezco la respuesta.

    El query no es mío, me pidieron meterlo en un PL/SQL para poder contar cuánto tarda y demostrar que no está optimizado, lo hice creando un cursor que me guardara el num de empleado y pasandoselo como parámetro.

Still have questions? Get your answers by asking now.