ここにはいくつかのオプションがあります。クエリを明示カーソルとして開き、適切なコレクションにフェッチ...バルクコレクションすることができます。 EXECUTE IMMEDIATE ... BULKCOLLECTINTOを使用できます。または、聞きたくないと言うように、DBMS_SQLを使用できます。
EXECUTE IMMEDIATE ... BULK COLLECTを使用するには、次のようなものを使用します
CREATE TABLE DATA_TABLE(FIELD1 NUMBER,
FIELD2 VARCHAR2(100));
INSERT INTO DATA_TABLE (FIELD1, FIELD2)
SELECT 1, 'ONE' FROM DUAL UNION ALL
SELECT 1, 'TWO' FROM DUAL UNION ALL
SELECT 2, 'THREE' FROM DUAL UNION ALL
SELECT 2, 'FOUR' FROM DUAL UNION ALL
SELECT 3, 'LAST' FROM DUAL;
DECLARE
TYPE typeCol IS TABLE OF DATA_TABLE%ROWTYPE;
colVals typeCol;
strField_name VARCHAR2(30) := 'FIELD1';
nField_val NUMBER := 2;
strQuery VARCHAR2(4000);
BEGIN
strQuery := 'SELECT * FROM DATA_TABLE WHERE ' || strField_name || '=' || nField_val;
DBMS_OUTPUT.PUT_LINE(strQuery);
EXECUTE IMMEDIATE strQuery BULK COLLECT INTO colVals;
FOR i IN colVals.FIRST..colVals.LAST LOOP
DBMS_OUTPUT.PUT_LINE(i || ': FIELD1=' || colVals(i).FIELD1 || ' FIELD2=' || colVals(i).FIELD2);
END LOOP;
END;
/
ドキュメントはこちら(10.1から-より優れた記述それ以降のバージョンIMO)