在pl/sql**塊中使用select into 賦值的話,有可能返回的是乙個結果集。此時,如果使用基本型別或自定義的記錄型別,將會報錯。
因此,需要定義乙個變數,是某種型別的集合。下面以乙個基於表的行型別的集合為例簡單介紹一下(相信基本型別同理吧)。
1declare
2cursor cur_tx is
select gkey from
t ;3 subtype tx_type is t%rowtype ; --
定義型別
4 type tx_tab is
table
of tx_type;--
定義新型別,是某個型別的集合
5 k t.gkey%
type;
6 v_tx tx_tab:=tx_tab();--
使用時應例項化,否則報錯
7begin
8open
cur_tx;
9fetch cur_tx into
k;10
select
*bulk collect into v_tx from t where gkey=k; --
返回結果集
11 forall x in v_tx.first .. v_tx.last--
遍歷操作
12--
statement;
13close
cur_tx;
14end;
集合型別要用is table of來定義,表示是乙個集合。
/*在使用時,一定要例項化,否則報錯:local collection types not allowed in sql statements. 還表示collection type應該是schema級的才能使用。*/
(注:經檢查,與例項化無關,與select into時要使用bulk collect 有關)
當然也可以使用游標,將結果集放在游標中。這裡只是提供另一種思路。
這裡提到了bulk collect和forall 批量繫結檢索。
forall與bulk collect的使用方法:
1.使用forall比for效率高,因為前者只切換一次上下文,而後者將是在迴圈次數一樣多個上下文間切換。
2.使用bluk collect一次取出乙個資料集合,比用游標條取資料效率高,尤其是在網路不大好的情況下。但bluk collect需要大量記憶體,因此最好確保每次取出的記錄不會很多。
參考:
PL Sql記錄,集合,記錄表的使用
為了處理單行單列的資料,開發人員可以使用標量變數 為了處理單行多列的資料,開發人員可以使用pl sql記錄 而為了處理單列多行資料,開發人員可以使用pl sql集合。記錄表處理多行多列。記錄的使用 declare type emp record is record name t emp.ename ...
開發記錄 集合重複BUG問題
上週記錄過乙個編寫將集合1中有而集合二中沒有的資料取出成新集合的方法,上次的方法看似是可用的,但是在實際使用過程中卻出現了無法進行型別轉化的問題而導致了bug的出現。畢竟在常規使用中並非所有用到此方法的型別都是同乙個型別,所以對這個方法進行改進。上一次的使用是在hibernate下用了一下方式取值 ...
Linq查詢datatable的記錄集合
通過linq查詢datatable資料集合滿足條件的資料集 1.首先定義查詢欄位的變數,比方深度 string strdepth 查詢深度的值 var datarows from datarow in datatable 須要查詢的datatable資料集 asenumerable where st...