2013-10-24 2 views
1

Используется массовая сборка для извлечения записей во вложенную таблицу. Я хочу найти запись с методом существует, но она не работает. узнал, что существует метод, который использует индекс, не ищет значения. Нужно ли мне перебирать каждую запись и искать совпадение? Есть ли самый короткий способ сделать это, потому что я собираюсь использовать ту же логику для большого набора записей? Чтение на веб-сайтах массовой коллекции не работает должным образом с Assosciative массивом с varchar как ключ, поэтому используются вложенные таблицы. Также не хотите читать каждую запись и хранить ее в hashmap, поскольку она ухудшает производительность.Что касается PLSQL Bulk Collect И вложенной таблицы

Create table sales(
    name varchar2(100) 
) 
insert into sales(name) values('Test'); 
insert into sales(name) values('alpha'); 
insert into sales(name) values(null); 


declare 
type sales_tab is table of varchar2(1000); 
t_sal sales_tab; 
begin 
select name bulk collect into t_sal from sales; 


if(t_sal.exists('Test')) THEN 
    dbms_output.put_line('Test exists'); 
END IF; 

dbms_output.put_line(t_sal.count); 
end; 
+0

почему бы не просто добавить ИНЕКЕ в запросе? что сделает его как быстрее, так и уменьшит объем памяти. –

+0

Невозможно использовать предложение where, потому что требуется много времени, когда я иду с большими данными, даже если у меня есть индекс на нем. – Arav

+0

«Не может»? Если это проблема с производительностью запросов, то я почти на 100% уверен, что выполнение фильтрации в PL/SQL не ускорится. –

ответ

3

exists() функция сообщает вам, если конкретный элемент с целым или varchar2 (для индекса ассоциативных массивов по varchar2 коллекциям) индекс коллекции существует. Он не проверяет членство. Для того, чтобы иметь возможность проверить, если коллекция содержит элемент с конкретным значением member of условия могут быть использованы:

SQL> declare 
    2 type sales_tab is table of varchar2(1000); 
    3 t_sal sales_tab; 
    4 begin 
    5 select name 
    6  bulk collect into t_sal 
    7  from sales; 
    8 
    9 if('Test' member of t_sal) THEN 
10  dbms_output.put_line('Test exists'); 
11 END IF; 
12 
13 dbms_output.put_line(t_sal.count); 
14 end; 
15/
Test exists 
3 
PL/SQL procedure successfully completed 
+0

Большое спасибо. Это отличная помощь. Как я могу проверить дубликаты ключевых членов. Если я хочу знать, есть ли более одного «теста», тогда я хочу сделать логику на ее основе. – Arav

+0

@Arav Это становится все глубже. В зависимости от вашей конечной цели вы должны спросить себя, действительно ли вам нужна процедура для этого? Как сказал Джеффри Кемп в комментарии к вашему вопросу, было бы лучше использовать простой SQL, было бы проще проверить наличие дубликатов? –

+0

Большое спасибо. Попробует снова проверить запрос sql. Возможно, я упустил производительность sql-запроса. – Arav

Смежные вопросы