Я пытаюсь динамически создать несколько нулевых столбцов в функции PL/SQL, которая возвращает SQL-запрос в вершине оракула, и у меня возникают некоторые трудности с этим. Вот код, который у меня есть до сих пор:
DECLARE
l_query VARCHAR2(4000);
l_cols VARCHAR2(4000) := NVL(:P31_PARTS,'abc123');
l_cols_arr apex_t_varchar2;
counter number(3,1);
BEGIN
l_cols_arr := apex_string.split(p_str => l_cols, p_sep => ':');
counter := l_cols_arr.count;
l_query := 'SELECT CRITERIA_NAME, ';
FOR i IN 1..(counter - 1)
LOOP
l_query := l_query || 'CAST(NULL AS varchar2(4000)) AS "'||l_cols_arr(i)||'", ';
END LOOP;
l_query := l_query || 'CAST(NULL AS varchar2(4000)) AS "'||l_cols_arr(counter)||'" FROM TABLE_VIEW';
return l_query;
END;
В своем текущем состоянии код проверяется, но во время выполнения загрузка страницы дает мне следующую ошибку:
Error during rendering of region "Data Input.2".
В моих попытках устранить проблему я вывел содержимое :P31_Parts
в элемент страницы только для отображения, и он отображает следующую строку:
После копирования содержимого элемента страницы и жесткого кодирования его в l_cols
код запускается и выполняется точно так, как я хотел бы. Я не слишком хорошо знаком с тем, как оракул хранит данные и чем это отличается от того, как он отображает их в элементе страницы, но если это поможет, :P31_PARTS
— это строка с разделителями-двоеточиями, сгенерированная из группы флажков на другой странице в приложении.
Если кого-то смущает объяснение, не стесняйтесь спрашивать, и я сделаю все возможное, чтобы прояснить любые вопросы. Спасибо
Провел быстрый тест с набором данных EMP, и он отлично работает:
DECLARE
l_query VARCHAR2(4000);
l_cols VARCHAR2(4000) := NVL(:P146_COLS,'EMPNO');
l_cols_arr apex_t_varchar2;
BEGIN
l_cols_arr := apex_string.split(p_str => l_cols, p_sep => ':');
l_query := 'SELECT ';
FOR i IN 1..l_cols_arr.count
LOOP
l_query := l_query||' CAST(NULL AS varchar2(4000)) AS "'||l_cols_arr(i)||'", ';
APEX_UTIL.SET_SESSION_STATE('P146_COL'||i,l_cols_arr(i));
END LOOP;
l_query := RTRIM(l_query,', ')||' FROM EMP';
apex_debug.info(
p_message => l_query);
RETURN l_query;
END;
P146_COLS
Обратите внимание, что вы должны запустить страницу в режиме отладки и проверить журналы отладки. Вы также можете использовать API apex_debug
для регистрации собственных сообщений в журналах отладки, как показано в примере кода.
ОБНОВЛЯТЬ:
Заголовки столбцов также можно сделать динамическими. На странице создайте несколько элементов страницы P146_COL1,P146_COL2,...
. Затем установите для заголовков общих столбцов значение &P146_COL1!HTML.
для COL01, &P146_COL2!HTML.
для COL02 и т. д. В исходном коде установите значения для каждого из элементов страницы заголовков столбцов.
Ну... как я сказал в своем ответе (последняя строка) - отлаживать отладку и отлаживать... это ваша среда, у меня нет к ней доступа, поэтому я не могу проверить журналы отладки, но я бы начал с этого ...
Есть ли способ сделать это без использования общих имен столбцов в классическом отчете?
Я считаю, что общие столбцы необходимы, если количество столбцов может варьироваться. Но что вы можете сделать, так это использовать элементы страницы в качестве заголовков столбцов и установить их в коде pl/sql, который генерирует запрос. Смотрите мой обновленный ответ. Не забудьте отметить вопрос как отвеченный - лучший способ сказать спасибо.
И я предполагаю, что вы не можете делать общие столбцы в интерактивной сетке или сделать классический отчет редактируемым?
Я не думаю, что вы можете - извините.
Во-первых, большое спасибо за ваш ответ, но я заметил несколько проблем при попытке. При использовании моей собственной таблицы код скомпилировался, и страница запустилась без ошибок в журнале отладки, но таблицы там нет, как если бы это была скрытая область. Когда таблица emp работает нормально. Попробовал с интерактивным отчетом (именно это я и хочу в итоге, извините, что не уточнил) получаю
ORA-00904 "D"."CABLEPARTS":invalid identifier