Динамическое создание нулевых столбцов в PLSQL

Я пытаюсь динамически создать несколько нулевых столбцов в функции 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 — это строка с разделителями-двоеточиями, сгенерированная из группы флажков на другой странице в приложении.

Если кого-то смущает объяснение, не стесняйтесь спрашивать, и я сделаю все возможное, чтобы прояснить любые вопросы. Спасибо

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Провел быстрый тест с набором данных EMP, и он отлично работает:

  • Тип региона: классический отчет
  • Тело функции PL/SQL:
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
  • Использовать общие имена столбцов: установлен флажок
  • Общее количество столбцов: 10

Обратите внимание, что вы должны запустить страницу в режиме отладки и проверить журналы отладки. Вы также можете использовать API apex_debug для регистрации собственных сообщений в журналах отладки, как показано в примере кода.

ОБНОВЛЯТЬ: Заголовки столбцов также можно сделать динамическими. На странице создайте несколько элементов страницы P146_COL1,P146_COL2,.... Затем установите для заголовков общих столбцов значение &P146_COL1!HTML. для COL01, &P146_COL2!HTML. для COL02 и т. д. В исходном коде установите значения для каждого из элементов страницы заголовков столбцов.

Во-первых, большое спасибо за ваш ответ, но я заметил несколько проблем при попытке. При использовании моей собственной таблицы код скомпилировался, и страница запустилась без ошибок в журнале отладки, но таблицы там нет, как если бы это была скрытая область. Когда таблица emp работает нормально. Попробовал с интерактивным отчетом (именно это я и хочу в итоге, извините, что не уточнил) получаю ORA-00904 "D"."CABLEPARTS":invalid identifier

Jason Bourne 03.04.2023 16:43

Ну... как я сказал в своем ответе (последняя строка) - отлаживать отладку и отлаживать... это ваша среда, у меня нет к ней доступа, поэтому я не могу проверить журналы отладки, но я бы начал с этого ...

Koen Lostrie 03.04.2023 17:07

Есть ли способ сделать это без использования общих имен столбцов в классическом отчете?

Jason Bourne 03.04.2023 23:42

Я считаю, что общие столбцы необходимы, если количество столбцов может варьироваться. Но что вы можете сделать, так это использовать элементы страницы в качестве заголовков столбцов и установить их в коде pl/sql, который генерирует запрос. Смотрите мой обновленный ответ. Не забудьте отметить вопрос как отвеченный - лучший способ сказать спасибо.

Koen Lostrie 04.04.2023 08:29

И я предполагаю, что вы не можете делать общие столбцы в интерактивной сетке или сделать классический отчет редактируемым?

Jason Bourne 04.04.2023 20:33

Я не думаю, что вы можете - извините.

Koen Lostrie 04.04.2023 23:55

Другие вопросы по теме