
Cursor dinámico para usar dblinks dinamicamente
Publicado por Daniel Rodas (9 intervenciones) el 09/08/2018 17:07:18
Hola
Tengo una porción de código de un stored procedure que hace mas o menos lo siguiente
DECLARE
CURSOR cursor_datos_procesar IS
SELECT DISTINCT FSC
FROM ORION.PSIILO_ORDER_ITEMS
WHERE FSC NOT IN (SELECT DISTINCT FSC
FROM P5AV_PICKMAP@DBL_GOM_PSIILO2 A,
P5AV_PICKMAP_DETAILS@DBL_GOM_PSIILO2 B
WHERE B.SUFFIX = A.SUFFIX
AND B.CAMPAIGN_NO =A.CAMPAIGN_NO);
BEGIN
FOR origen IN cursor_datos_procesar
LOOP
-- codigo
-- codigo
-- codigo
END LOOP;
END;
Yo necesito transformar esa declaración a una forma dinámica para que yo pueda mandarle como un parámetro del SP el nombre del DBLINK y así no tener que repetir la misma porción del código cuando cambie el DBLINK.
Se que puedo definir algo como lo siguiente:
DECLARE
TYPE EmpCurTyp IS REF CURSOR;
c EmpCurTyp;
emp_rec emp%ROWTYPE;
stmt_str VARCHAR2(200);
e_job emp.job%TYPE;
BEGIN
stmt_str := 'SELECT * FROM emp WHERE job = :1';
-- in a multi-row query
OPEN c FOR stmt_str USING 'MANAGER';
LOOP
FETCH c INTO emp_rec;
EXIT WHEN c%NOTFOUND;
END LOOP;
CLOSE c;
-- in a single-row query
EXECUTE IMMEDIATE stmt_str INTO emp_rec USING 'PRESIDENT';
END;
/
Pero me queda duda cuando hace el OPEN del cursor ese "USING 'MANAGER'" ¿porque se lo pone o que tendría que ver en mi caso? o ¿podría ir allí mi parámetro?
Otra duda con ese código es que si emp_rec recibe el cursor ¿como tomo cada valor de cada campo del select? porque en el ejemplo hacen select *; pero en mi caso hago select de campo(s) especifico(s)
¿No se si me expliqué suficiente en lo que necesito?
Gracias
Tengo una porción de código de un stored procedure que hace mas o menos lo siguiente
DECLARE
CURSOR cursor_datos_procesar IS
SELECT DISTINCT FSC
FROM ORION.PSIILO_ORDER_ITEMS
WHERE FSC NOT IN (SELECT DISTINCT FSC
FROM P5AV_PICKMAP@DBL_GOM_PSIILO2 A,
P5AV_PICKMAP_DETAILS@DBL_GOM_PSIILO2 B
WHERE B.SUFFIX = A.SUFFIX
AND B.CAMPAIGN_NO =A.CAMPAIGN_NO);
BEGIN
FOR origen IN cursor_datos_procesar
LOOP
-- codigo
-- codigo
-- codigo
END LOOP;
END;
Yo necesito transformar esa declaración a una forma dinámica para que yo pueda mandarle como un parámetro del SP el nombre del DBLINK y así no tener que repetir la misma porción del código cuando cambie el DBLINK.
Se que puedo definir algo como lo siguiente:
DECLARE
TYPE EmpCurTyp IS REF CURSOR;
c EmpCurTyp;
emp_rec emp%ROWTYPE;
stmt_str VARCHAR2(200);
e_job emp.job%TYPE;
BEGIN
stmt_str := 'SELECT * FROM emp WHERE job = :1';
-- in a multi-row query
OPEN c FOR stmt_str USING 'MANAGER';
LOOP
FETCH c INTO emp_rec;
EXIT WHEN c%NOTFOUND;
END LOOP;
CLOSE c;
-- in a single-row query
EXECUTE IMMEDIATE stmt_str INTO emp_rec USING 'PRESIDENT';
END;
/
Pero me queda duda cuando hace el OPEN del cursor ese "USING 'MANAGER'" ¿porque se lo pone o que tendría que ver en mi caso? o ¿podría ir allí mi parámetro?
Otra duda con ese código es que si emp_rec recibe el cursor ¿como tomo cada valor de cada campo del select? porque en el ejemplo hacen select *; pero en mi caso hago select de campo(s) especifico(s)
¿No se si me expliqué suficiente en lo que necesito?
Gracias
Valora esta pregunta


0