Настройка производительности в запросе функции Plsql - PullRequest
0 голосов
/ 01 января 2019

У меня есть функция plsql.И эта функция имеет запрос, как показано ниже:

select  colum_name 
from table_name 
where  filter_coloumn_name in ( select filter_coloumn_name from table_name_2); 

Моя функция используется другим запросом для возврата значения из запроса.Этот запрос, который использует эту функцию, занимает больше времени.Даже сайт (передний экран) вниз.Потому что table_name_2 имеет три миллиона записей.Так что я должен использовать некоторый метод настройки производительности в моей функции.Я изменяю свой функциональный запрос, как показано ниже:

cursor my_cursor IS  
  select filter_coloumn_name from table_name_2;

TYPE cursor_array_type IS TABLE OF my_cursor%ROWTYPE INDEX BY BINARY_INTEGER; 
m    cursor_array_type;

TYPE cursor_table_type IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;
cursor_table_object cursor_table_type; 

fetch_size NUMBER := 5000;
index_var number;

begin 
index_var := 1; 

open my_cursor; 
    loop
      FETCH my_cursor BULK COLLECT
        into m LIMIT fetch_size;
      exit when my_cursor %notfound; 

     for i in 1 .. m.count loop       
        cursor_table_object (index_var) := m(i).filter_coloumn_name;     
       index_var := index_var + 1;
     end loop;
    end loop;
  Close my_cursor; 

   select  colum_name 
    from table_name 
    where  filter_coloumn_name in (cursor_table_object);

выберите имя столбца из имени таблицы, где filter_coloumn_name в (cursor_table_object);

А именно, я хочу получить все значения в одномвремя, а затем я хочу использовать этот объект таблицы, как указано выше.Но я не могу использовать табличный объект с условным выражением в запросе SQL.

Я принимаю PLS-00382: expression is of wrong type ошибку.

Я хочу использовать этот табличный объект, как показано ниже:

select  colum_name 
from table_name 
where  filter_coloumn_name in ('bla', 'bla bla', 'bla bla bla');

Должен ли я преобразовать табличный объект в массив?

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Предложение, основанное на том, что вы уже сказали: как насчет использования табличной функции ?Это позволяет использовать что-то вроде оператора, который вы хотели использовать, например

select colum_name from table_name where filter_coloumn_name in (cursor_table_object);

, но который возвращает

PLS-00382: выражение имеет неправильный тип


Вот пример, основанный на схеме Скотта.Посмотрите:

SQL> create or replace function f_test
  2    return sys.odcinumberlist
  3  is
  4    -- Cursor's SELECT should contain your 3-million-rows table
  5    cursor cur_r is select deptno from dept where deptno < 30;
  6    l_ret sys.odcinumberlist;
  7  begin
  8    open cur_r;
  9    fetch cur_r bulk collect into l_ret;
 10    close cur_r;
 11    return l_ret;
 12  end;
 13  /

Function created.

SQL> -- How to use it?
SQL> select e.ename
  2  from emp e join table(f_test) x on x.column_value = e.deptno;

ENAME
----------
MILLER
KING
CLARK
ADAMS
SCOTT
FORD
JONES
SMITH

8 rows selected.

SQL>
0 голосов
/ 01 января 2019

Вы должны использовать существует вместо in, также table_name_2 должно иметь индекс над полем filter_coloumn_name.Используя курсор, вы получаете полный доступ к большой таблице.

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