Тело функции 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. Однако я, вероятно, выбрал бы решение Дэна и поместил бы запросы в пакет с функциями. Это гораздо более прозрачно, чем запрашивать определение представления в словаре данных.

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