Pl / SQL запрос представления в функции - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть функция ниже

CREATE OR REPLACE FUNCTION BUTCE_REPORT_Fun (birim_id IN VARCHAR2)
   RETURN sys_refcursor
IS
   retval sys_refcursor;
BEGIN
   OPEN retval FOR
      select * 
      from ifsapp.butce_gerceklesme 
      WHERE  budget_year = '2018' 
      AND USER_GROUP = birim_id ;

   RETURN retval;
END BUTCE_REPORT_Fun;

и пытаюсь выполнить функцию таким образом

SELECT * from table(IFSAPP.BUTCE_REPORT_FUN('3008'))

строка выше генерирует это исключение

ora-22905 не может получить доступ к строкам из не вложенного элемента таблицы

помнить, что ifsapp.butce_gerceklesme - это представление (которое я не думаю, что оно имеет значение). Так как я могу решить это. любая помощь приветствуется. На самом деле, я пытаюсь создать функцию, которая возвращает строки из представленного выше представления в соответствии с предоставленными параметрами. так что, если я смогу достичь этого другим способом, это будет лучше.

1 Ответ

0 голосов
/ 07 ноября 2018

Ref Курсоры предназначены для использования в вызовах программ: они сопоставляются с классами JDBC или ODBC ResultSet. Они не могут быть использованы в качестве входных данных для вызова таблицы (). Кроме того, нет смысла вызывать вашу функцию в SQL, потому что вы можете просто выполнить встроенный запрос в SQL.

основная таблица огромна, и каждый раз выбирается внутренний запрос, назначенный для USER_GROUP

Так что, может быть, вам нужен факторинг подзапроса AKA предложение WITH?

with ug as (
   select con2.CODE_PART_VALUE 
   from IFSAPP.ACCOUNTING_ATTRIBUTE_CON2 con2 
   where COMPANY = 'XYZ' 
   and ATTRIBUTE = 'ABC' 
   and CODE_PART = 'J'
   and con2.ATTRIBUTE_VALUE=407 
   AND rownum = 1
)
select * 
from ifsapp.butce_gerceklesme t
     join ug on t.USER_GROUP = ug.CODE_PART_VALUE 
WHERE t.budget_year = '2018' 

Настройка запросов в StackOverflow - игра в кружки, потому что есть очень много вещей, которые могут быть ответственны за неоптимальную производительность. Но, как правило, вы должны попытаться настроить весь запрос. Инкапсуляция его части в PL / SQL вряд ли улучшит время отклика и может даже ухудшить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...