В вашем коде есть несколько недостатков:
l_cur_query VARCHAR2(5000) := 'SELECT count(*) as noofrecords,'
|| l_groupby_column
|| ' as groupbycolumn from bi_request where '
|| l_groupby_column
|| ' IS NOT NULL';
Вы пропустили предложение 'GROUP BY '||l_groupby_column
.
TYPE rec_groupby_data IS TABLE OF bi_request%rowtype;
Это будет работать только при запуске SELECT * FROM bi_request...
. Однако выбранные столбцы и типы данных известны только во время выполнения.
OPEN cur_groupby_data FOR l_cur_query USING l_groupby_column;
Невозможно связать имена столбцов (т. Е. USING l_groupby_column
). Кроме того, вы не определили никакой заполнитель (например, :b1
) в строке запроса.
out_groupby_tab := return_groupby_param_arr(return_groupby_report());
out_groupby_tab.DELETE;
Совершенно бесполезно инициализировать переменную и немедленно удалить ее впоследствии.
LOOP
FETCH cur_groupby_data BULK COLLECT INTO l_cur_groupby_data
END LOOP;
Когда вы используете FETCH ... BULK COLLECT INTO ...
, тогда вам нечего зацикливать. BULK COLLECT
извлекает все данные сразу в вашу переменную. Либо используйте BULK COLLECT INTO
или FETCH ... INTO ...
вместе с циклом.
В общем, если вам нравится запускать такой динамический SQL, вам нужно использовать пакет DBMS_SQL .