Я работаю с 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?
Заранее спасибо.
ORA-20999: синтаксический анализ возвратил результаты запроса в «ORA-20999: Не удалось проанализировать SQL-запрос! <p> ORA-06550: строка 24, столбец 8: ORA-00904:« 18.7 »: недопустимый идентификатор </p>».
Можете ли вы представить свой код для функции PL / SQL?


Вам следует
этот запрос должен выглядеть так:
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. :)
что такое сообщение об ошибке?