Использование тела функции PL / SQL, возвращающего SQL-запрос

Я работаю с Oracle APEX, и я пытаюсь сохранить динамический запрос sql в теле функции PL / SQL. Вот мой текущий SQL-запрос для классического отчета:

SELECT 
    RELEASE,
    COUNT(*) as "Total Tests", --total
    SUM(CASE WHEN TYPE = 'P1' THEN 1 ELSE 0 END) as "P1",
    SUM(CASE WHEN TYPE = 'P2' THEN 1 ELSE 0 END) as "P2",
    SUM(CASE WHEN TYPE = 'P3' THEN 1 ELSE 0 END) as "P3",
    SUM(CASE WHEN TYPE = 'P4' THEN 1 ELSE 0 END) as "P4"
    FROM TABLENAME
group by RELEASE
ORDER BY case
    when RELEASE = '19.3' then 1
    when RELEASE = '18.11' then 2
    when RELEASE = '18.9' then 3
    when RELEASE = '18.7' then 4
    when RELEASE = '17.3' then 5
    else 6
end asc

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

Кто-нибудь знает, как преобразовать это в динамическую функцию pl / sql?

Заранее спасибо.

что такое сообщение об ошибке?

Eray Balkanli 15.11.2018 17:16

ORA-20999: синтаксический анализ возвратил результаты запроса в «ORA-20999: Не удалось проанализировать SQL-запрос! <p> ORA-06550: строка 24, столбец 8: ORA-00904:« 18.7 »: недопустимый идентификатор </p>».

aphibui 15.11.2018 17:44

Можете ли вы представить свой код для функции PL / SQL?

Stilgar 15.11.2018 21:34
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
3
9 828
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вам следует

  • создать классический отчет, источником которого является функция, возвращающая запрос
  • этот запрос должен выглядеть так:

    return '
      SELECT 
        RELEASE,
        COUNT(*) as "Total Tests", --total
        SUM(CASE WHEN TYPE = ''P1'' THEN 1 ELSE 0 END) as "P1",
        SUM(CASE WHEN TYPE = ''P2'' THEN 1 ELSE 0 END) as "P2",
        SUM(CASE WHEN TYPE = ''P3'' THEN 1 ELSE 0 END) as "P3",
        SUM(CASE WHEN TYPE = ''P4'' THEN 1 ELSE 0 END) as "P4"
        FROM ' || 
        SYS.DBMS_ASSERT.sql_object_name(:P1_TABLE_NAME) ||
      ' group by RELEASE 
      ORDER BY case
        when RELEASE = ''19.3''  then 1
        when RELEASE = ''18.11'' then 2
        when RELEASE = ''18.9''  then 3
        when RELEASE = ''18.7''  then 4
        when RELEASE = ''17.3''  then 5
        else 6
      end asc';
    
  • DBMS_ASSERT здесь, чтобы предотвратить внедрение SQL

  • установите "использовать общие имена столбцов" на "Да"
  • имя элемента страницы - :P1_TABLE_NAME (в моем примере); это должно быть текстовое поле, отправьте при нажатии Enter

Полагаю, это все.

Спасибо, это работает! Спасибо также за подсказку DMBS_ASSERT. :)

aphibui 16.11.2018 00:29

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