2013-10-24 39 views
1

使用批量收集將記錄提取到嵌套表中。我想用存在的方法搜索一個記錄,但它沒有解決。來了解存在的方法使用索引不查找的值。我是否需要瀏覽每條記錄並搜索比賽?有沒有最短的方法來做到這一點,因爲我將爲大量記錄使用相同的邏輯?閱讀在網站批量收集不能正常使用與varchar作爲關鍵使用嵌套表的assosciative數組。也不想讀取每條記錄並將其存儲在散列表中,因爲它會降低性能。關於PLSQL批量收集和嵌套表

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

爲什麼不只需添加一個WHERE子句的查詢?這將使它更快,並使用更少的內存。 –

+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它越來越深。根據你的最終目標,你必須問問自己,你是否真的需要程序處理?正如Jeffrey Kemp在對你的問題的評論中所說的那樣,使用普通SQL不是更好,那麼測試重複數據會更簡單嗎? –

+0

非常感謝。將嘗試再次檢查sql查詢。可能是我忽略了sql查詢性能。 – Arav