Тело функции 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: Parsing returned query results in "ORA-20999: Failed to parse SQL query!

ORA-06550: line 12, column 23: ORA-00936: missing expression

"

Я даже вставил содержимое переменной sQuery во временную таблицу, и результат совпадает с содержимым представления.

Я использовал параметризованное представление, но когда я возвращаю запрос непосредственно в oracle apex, отчет становится намного быстрее.

Если вы передадите Squery: = 'Select 1 from dual where 1 =: P1_ITEM', возврат будет успешным. Есть какие-нибудь идеи о том, как обойти ошибку и использовать этот метод?


person Fabio Batista    schedule 06.11.2019    source источник
comment
Мое первое предположение заключалось в том, что вы заменяете #VARIABLE_FIX на введенный параметр, который вы не предоставляете. Попробуйте использовать вместо: P1_ITEM ': P1_ITEM'   -  person TineO    schedule 06.11.2019
comment
Похоже, вы проделываете долгий путь, чтобы решить проблему, потенциально создавая проблемы с производительностью и риск внедрения SQL-кода. Что вы на самом деле пытаетесь решить? Можно ли это решить с помощью sys_context?   -  person Scott    schedule 06.11.2019
comment
Есть еще одна проблема с вашим кодом. Выбор из all_views без владельца может привести к дублированию значений ORA-01422: точная выборка возвращает больше, чем запрошенное количество строк   -  person Thomas Strub    schedule 06.11.2019
comment
Использование представлений в целом для упрощения бизнес-логики, общих объединений и т. Д. - это хорошо. Но лично я думаю, что то, что вы пытаетесь сделать, является чрезмерной оптимизацией и потенциально ограничивает. Функция PL / SQL, возвращающая SQL-запрос, по-разному поддерживается классическими отчетами (поддерживает общие столбцы) и интерактивными отчетами (не поддерживает общие столбцы), но не всеми интерактивными сетками, списками значений и т. Д. Когда вы используете эту гибкость, она приходит с технической задолженностью и стоимостью сложности, которая может превышать любые преимущества.   -  person Dan McGhan    schedule 06.11.2019
comment
Кроме того, в чем преимущество использования представлений над пакетом с функциями, которые возвращают запрос SQL на основе ввода?   -  person Dan McGhan    schedule 06.11.2019


Ответы (1)


Ваше заявление

sQuery := REPLACE(sView, '''#VARIABLE_FIX''', :P1_ITEM);

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

sQuery := REPLACE(sView, '#VARIABLE_FIX', :P1_ITEM);

и тебе хорошо идти. Проверено 19.1. Однако я, вероятно, выбрал бы решение Дэна и поместил бы запросы в пакет с функциями. Это гораздо более прозрачно, чем запрашивать определение представления в словаре данных.

person Koen Lostrie    schedule 06.11.2019