Тело функции PL / SQL, возвращающее SQL-запрос из представления - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь создать что-то более сложное. Чтобы не иметь много запросов и точек обслуживания, идея состоит в том, чтобы использовать представления.

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 Ответ

2 голосов
/ 06 ноября 2019

Ваше утверждение

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

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

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

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

...