Hello! Is there any way to use "execute immediate" with cursors? I would like to make my stored proc somewhat dynamic. Here is a scaled-down version of my procedure:

CREATE OR REPLACE PACKAGE Publications_pkg AS
TYPE char_array IS TABLE OF VARCHAR2(250)
INDEX BY BINARY_INTEGER;
PROCEDURE getPublicationInfo(
o_PubNumber OUT char_array,
o_Locations OUT char_array,
o_Title OUT char_array,
o_Organization OUT char_array,
o_PublicationType OUT char_array,
i_DisplayRows IN INTEGER);

END Publications_pkg;
/

CREATE OR REPLACE PACKAGE BODY Publications_pkg AS
PROCEDURE getPublicationInfo(
o_PubNumber OUT char_array,
o_Locations OUT char_array,
o_Title OUT char_array,
o_Organization OUT char_array,
o_PublicationType OUT char_array,
i_DisplayRows IN INTEGER)
IS

CURSOR crsPub IS
SELECT P.PubNumber,
L.Name AS Locations,
SUBSTR(P.Title, 1, 50),
OrgName(P.OrganizationID) AS Organization,
PubTypeName(P.PublicationTypeID) AS PublicationType
FROM (SELECT PublicationID, Name FROM Location) L, Publications P
WHERE LOWER(P.Title) LIKE LOWER('%test%')
AND L.PublicationID (+) = P.ID
ORDER BY RevDate;

BEGIN
IF NOT crsPub%ISOPEN THEN -- open the cursor if
OPEN crsPub; -- not already open
END IF;

FOR i IN 1..i_DisplayRows LOOP
FETCH crsPub INTO o_PubNumber(i),
o_Locations(i),
o_Title(i),
o_Organization(i),
o_PublicationType(i);
IF crsPub%NOTFOUND THEN
CLOSE crsPub;
END IF;
END LOOP;
END;
/

I have executed statements in the past by concatinating variables that have parts of code in them, and using many if statements, but because the cursor can't go after "BEGIN," (I think this is true of all cases), I haven't been able to make it work.

Have I painted myself into a corner by the way I've structured this procedure, or is there another way to make the proc dynamic?

Thanks in advance for any help!
Shannon