viernes, 17 de diciembre de 2010

Package con un procedure que devuelve un cursor como parametro....

Este es un package que si bien me parece tonto tiene sus vueltas.
Lo interesante es que tiene un procedure dentro de un package que retorna un cursor que se arma(obviamente) al pasarle un valor en este caso esta hardcodeado....
Y otro tema que me parecio a resaltar es la siguiente, la forma:
FOR c_emp_rec IN c_cur LOOP ....NO ANDA
Con lo cual hay que abrirlo asi.
Si o si hay que abrirlo con un fetch (LOOP FETCH c_cur INTO c_emp_rec).

CREATE OR REPLACE PACKAGE empleados_pkg IS

CURSOR c_emp IS
SELECT capu_carp_cd_ramo, capu_cd_producto
FROM cart_productos
where rownum<10;

TYPE empleados_type IS REF CURSOR
RETURN c_emp%ROWTYPE;

PROCEDURE datos_empleados ( par1 IN VARCHAR2,
cursor1 OUT empleados_type );
PROCEDURE parent;
END empleados_pkg;

create or replace PACKAGE BODY empleados_pkg IS

PROCEDURE datos_empleados ( par1 IN VARCHAR2,
cursor1 OUT empleados_type)
IS
BEGIN
IF par1 IS NOT NULL THEN
OPEN cursor1 FOR SELECT capu_carp_cd_ramo, capu_cd_producto
FROM cart_productos
and capu_cd_producto=par1;
ELSE
OPEN cursor1 FOR SELECT capu_carp_cd_ramo, capu_cd_producto
FROM cart_productos
where rownum<10;
END IF;
END datos_empleados;

PROCEDURE parent IS
c_cur empleados_type;
c_emp_rec c_cur%ROWTYPE;
BEGIN

datos_empleados('123', c_cur);
LOOP
FETCH c_cur INTO c_emp_rec;
EXIT WHEN c_cur%NOTFOUND;
DBMS_OUTPUT.PUT_LINE (c_emp_rec.capu_carp_cd_ramo);
DBMS_OUTPUT.PUT_LINE (c_emp_rec.capu_cd_producto);
END LOOP;
CLOSE c_cur;
/*TENER PRESENTE QUE CON ESTA FORMA DE APERTURA NO ANDA
FOR c_emp_rec IN c_cur LOOP
DMBS_OUTPUT.PUT_LINE('capu_carp_cd_ramo=' || c_emp_rec.capu_carp_cd_ramo);
DMBS_OUTPUT.PUT_LINE('capu_cd_producto=' || c_emp_rec.capu_cd_producto);
END LOOP;
*/
end parent;
END;

--Para probarlo--
begin
empleados_pkg.parent;
end;

No hay comentarios:

Publicar un comentario