I found a solution to my problem by redefining the problem.
I create an Oracle "Global Temporary Table" and then modified my stored procedure (package) to use the "Temporary Table".
(a) MY store procedure now uses dynamic sql to populate the temporary table using an "insert into table" statement with a subquery.
EXECUTE IMMEDIATE 'INSERT INTO TEMP_TABLE(...)
SELECT *
FROM ' || LV_GL001M_TBL || 'GL,
' || LV_GL101T_TBL || 'TRANS
The real (current) table names are in the local variables (LV_GL001M_TBL and LV_GL101T_TBL). The contents of the local variables
change depending on the input parameter "Fiscal_Year".
(B) After populating the temporary table, my stored procedure finishes by using a "strong" cursor to extract the contents of the temporary table and returns the record set to Crystal Reports
Specification of a strong cursor based on the Global Temporary Table
TYPE TEMP_TABLE_TYPE IS REF CURSOR RETURN TEMP_TABLE%ROWTYPE;
The Procedure's Input/Output Parameters include
CURSOR_OUT IN OUT TEMP_TABLE_TYPE,
FISCAL_YEAR IN VARCHAR2,
Extract the contents of the Global Temporary Table with a simple query and a dynamic cursor.
BEGIN
OPEN CURSOR_OUT FOR
SELECT *
FROM TEMP_TABLE
END
---------------------------------------------------------------
Crystal Reports is happy because it has a strong cursor (with a consistent record structure) to work with and the stored procedure is able to change the tables used to populate the temporary table based on the input parameter "Fiscal_Year".