RE:procedimiento almacenado
Supongo que lo que estas intentando hacer es que el procedimiento te devuelva los N registros resultado de la consulta que ejecutas. Pero el codigo de PL/SQL no funciona de esta manera. El resultado de la consulta se lo tienes que asignar a algo, y este algo es el que devuelves.
Generalmente esto se hace por medio de un Ref Cursor.
Aqui te pongo un ejemplo completo de como puedes hacerlo:
Con este pequeño còdigo explico como mostrar un refcursor desde Pl/sql, muy ùtil para cuando necesitas comprobar datos, o simplemente procesarlos
-- Creado pro Hector Gabriel Ulloa Ligarius
-- 27 de Julio del 2005
-- Como mostrar un refcursor desde PL/SQL
--------------------
--Código del package
--------------------
create or replace PACKAGE ejemplo_package IS
--Declaro el tipo ref cursor
TYPE var_refcursor IS REF CURSOR;
--Declaro la función que retorna el ref cursor
FUNCTION retorna_datos RETURN var_refcursor;
END ejemplo_package;
/
create or replace PACKAGE BODY ejemplo_package IS
FUNCTION retorna_datos RETURN var_refcursor IS
var_cursorpackage var_refcursor;
BEGIN
OPEN var_cursorpackage FOR
SELECT table_name ,
tablespace_name
FROM user_tables
WHERE rownum < 10 --Sólo muestro 9 , pues es un ejemplo
;
RETURN var_cursorpackage;
END;
END ejemplo_package;
/
----------------------------
--Código de un bloque Pl/Sql
----------------------------
declare
--Declaración de la variable de tipo REF CURSOR
v_refcursor ejemplo_package.var_refcursor;
--Declaración de variables para dejar los valores rescatados desde el REF CURSOR
vtable_name varchar2(1000);
vtablespace_name varchar2(1000);
begin
--Se llama al package que retorna los datos desde un cursor
v_refcursor := ejemplo_package.retorna_datos;
--Se rescata el valor desde elref cursor haciendo un fetch
FETCH v_refcursor
INTO vtable_name ,
vtablespace_name;
WHILE v_refcursor%FOUND LOOP
dbms_output.put_line('Nombre : '||vtable_name||' ,Tablespace : '||vtablespace_name);
FETCH v_refcursor
INTO vtable_name ,
vtablespace_name;
END LOOP;
--Se cierra el cursor que fue abierto al momento de realizar la llamada al package
CLOSE v_refcursor;
end;