Тело функции PL/ SQL, возвращающее SQL-запрос из представления
Я пытаюсь создать что-то более сложное. Чтобы не было много запросов и точек обслуживания, идея состоит в том, чтобы использовать представления.
create or replace view vw_teste as
Select 1
from dual
where 1 = '#VARIABLE_FIX';
Что я пытаюсь сделать
DECLARE
sQuery VARCHAR2(32767);
sView VARCHAR2(32767);
BEGIN
SELECT a.TEXT
into sView
FROM all_views a
where a.VIEW_NAME = 'VW_TESTE';
sQuery := REPLACE(sView, '''#VARIABLE_FIX''', :P1_ITEM);
return(sQuery);
END;
Возвращено ошибок:
"ORA-20999: Разбор вернул результаты запроса в"ORA-20999: Не удалось проанализировать SQL-запрос!
ORA-06550: строка 12, столбец 23: ORA-00936: отсутствует выражение
"
Я даже вставил содержимое переменной sQuery во временную таблицу, и результат совпадает с содержимым представления.
Я использовал параметризованное представление, но когда я возвращаю запрос прямо в oracle apex, отчет становится намного быстрее.
Если вы передадите Squery: = 'Select 1 from dual where 1 =: P1_ITEM'
, Возврат успешен. Есть идеи, как обойти ошибку и использовать этот метод?
1 ответ
Ваше заявление
sQuery := REPLACE(sView, '''#VARIABLE_FIX''', :P1_ITEM);
имеет слишком много кавычек - нет необходимости избегать кавычек, поскольку они уже есть в вашем определении представления. Замените эту строку на
sQuery := REPLACE(sView, '#VARIABLE_FIX', :P1_ITEM);
и тебе хорошо идти. Проверено 19.1. Однако я, вероятно, выбрал бы решение Дэна и поместил бы запросы в пакет с функциями. Это гораздо более прозрачно, чем запрашивать определение представления в словаре данных.