oracle-記憶體表(轉)
oracle-記憶體表(轉)[@more@]一、 記憶體表概念
1、PL/SQL表類似於C語言中的陣列。如果要宣告一個PL/SQL表,要先定義該表型別,然後在宣告屬於該型別的變數。
2、理論上,資料庫資料空間有多大,我們的記憶體表就可以儲存多大的資料,就是說他和我們的物理表是相同的,我們可以把物理表的資料完全複製到記憶體表中。
3、PL/SQL表的元素沒有必要按照特定的次序排列,因為他們不是象陣列那樣連續儲存在記憶體中,元素可以按照任意鍵值進行插入。
4、PL/SQL表的鍵值(KEY)沒有必要是順序的。表所佔用的記憶體並不依賴於鍵所使用的數值。
二、 宣告記憶體表
DECLARE
-- 定義表型別
TYPE T_USRID_ARRAY IS TABLE OF TF_F_USRARCH_MAIN.USRID%TYPE INDEX BY BINARY_INTEGER;
G_USERID T_USRID_ARRAY;
BEGIN
NULL;
END;
我們也可以定義表型別為一個表的所有欄位,例如:
DECLARE
-- 主表結構
TYPE T_USRREC IS RECORD(usrid tf_f_usrarch_main.usrid%TYPE,
mphonecode tf_f_usrarch_main.mphonecode%TYPE,
citycode tf_f_usrarch_main.citycode%TYPE,
servicecode tf_f_usrarch_main.servicecode%TYPE,
opendate tf_f_usrarch_main.opendate%TYPE,
firststoptime tf_f_usrarch_main.firststoptime%TYPE,
usrstatecodeset tf_f_usrarch_main.usrstatecodeset%TYPE,
utag3 tf_f_usrarch_main.utag3%TYPE,
callrankcode tf_f_usrarch_main.callrankcode%TYPE,
roamrankcode tf_f_usrarch_main.roamrankcode%TYPE,
advancepay tf_f_usrarch_main.advancepay%TYPE,
ureservvalue tf_f_usrarch_main.ureservvalue%TYPE,
creditfactor5 tf_f_usrarch_main.creditfactor5%TYPE);
-- 定義表型別
TYPE T_USRREC_ARRAY IS TABLE OF T_USRREC INDEX BY BINARY_INTEGER;
G_USERID T_USRREC_ARRAY;
BEGIN
NULL;
END;
三、 對錶型別的引用
DECLARE
-- 定義表型別
TYPE T_USRID_ARRAY IS TABLE OF TF_F_USRARCH_MAIN.USRID%TYPE INDEX BY BINARY_INTEGER;
G_USERID T_USRID_ARRAY;
V_USRID TF_F_USRARCH_MAIN.USRID%TYPE;
BEGIN
SELECT USRID INTO V_USRID FROM TF_F_USRARCH_MAIN WHERE MPHONECODE = ‘13351785505’;
G_USERID(1) := V_USRID;
G_USERID(2) := V_USRID;
G_USERID(10) := V_USRID;
G_USERID(-2) := V_USRID;
DBMS_OUTPUT.PUT_LINE(G_USERID(1));
DBMS_OUTPUT.PUT_LINE(G_USERID(2));
DBMS_OUTPUT.PUT_LINE(G_USERID(10));
DBMS_OUTPUT.PUT_LINE(G_USERID(-2));
END;
執行時設定:set serveroutput on
DECLARE
-- 主表結構
TYPE T_USRREC IS RECORD(usrid tf_f_usrarch_main.usrid%TYPE,
mphonecode tf_f_usrarch_main.mphonecode%TYPE,
citycode tf_f_usrarch_main.citycode%TYPE,
servicecode tf_f_usrarch_main.servicecode%TYPE,
opendate tf_f_usrarch_main.opendate%TYPE,
firststoptime tf_f_usrarch_main.firststoptime%TYPE,
usrstatecodeset tf_f_usrarch_main.usrstatecodeset%TYPE,
utag3 tf_f_usrarch_main.utag3%TYPE,
callrankcode tf_f_usrarch_main.callrankcode%TYPE,
roamrankcode tf_f_usrarch_main.roamrankcode%TYPE,
advancepay tf_f_usrarch_main.advancepay%TYPE,
ureservvalue tf_f_usrarch_main.ureservvalue%TYPE,
creditfactor5 tf_f_usrarch_main.creditfactor5%TYPE);
-- 定義遊標型別
TYPE T_USRREC_CUR IS REF CURSOR;
RETURN T_USRREC;
-- 定義表型別
TYPE T_USRREC_ARRAY IS TABLE OF T_USRREC INDEX BY BINARY_INTEGER;
-- 定義遊標
CUR_TF_F_USRARCH_MAIN T_USRREC_CUR;
-- 定義記憶體表
G_USER T_USRREC_ARRAY;
PersonKind T_USRREC;
v_cur BINARY_INTEGER;
BEGIN
v_cur := 0;
OPEN cur_tf_f_usrarch_main
FOR SELECT usrid,
mphonecode,
citycode,
servicecode,
opendate,
firststoptime,
SUBSTR(usrstatecodeset,-1,1),
utag3,
callrankcode,
roamrankcode,
advancepay,
ureservvalue,
creditfactor5
FROM tf_f_usrarch_main
WHERE removetag = '0'
AND substr(usrid, -2, 2) = '00'
AND rownum<100;
LOOP
v_cur := v_cur+1;
FETCH cur_tf_f_usrarch_main INTO PersonKind;
EXIT WHEN cur_tf_f_usrarch_main%NOTFOUND;
G_USER(v_cur).usrid := PersonKind.usrid;
G_USER(v_cur).mphonecode := PersonKind.mphonecode;
G_USER(v_cur).citycode := PersonKind.citycode;
G_USER(v_cur).servicecode := PersonKind.servicecode;
G_USER(v_cur).opendate := PersonKind.opendate;
G_USER(v_cur).firststoptime := PersonKind.firststoptime;
G_USER(v_cur).usrstatecodeset := PersonKind.usrstatecodeset;
G_USER(v_cur).utag3 := PersonKind.utag3;
G_USER(v_cur).callrankcode := PersonKind.callrankcode;
G_USER(v_cur).roamrankcode := PersonKind.roamrankcode;
G_USER(v_cur).advancepay := PersonKind.advancepay;
G_USER(v_cur).ureservvalue := PersonKind.ureservvalue;
G_USER(v_cur).creditfactor5 := PersonKind.creditfactor5;
END LOOP;
CLOSE cur_tf_f_usrarch_main;
DBMS_OUTPUT.PUT_LINE(G_USER(1).mphonecode||’ ’||G_USER(1).advancepay);
DBMS_OUTPUT.PUT_LINE(G_USER(2).mphonecode||’ ’||G_USER(2).advancepay);
DBMS_OUTPUT.PUT_LINE(G_USER(3).mphonecode||’ ’||G_USER(3).advancepay);
DBMS_OUTPUT.PUT_LINE(G_USER(10).mphonecode||’ ’||G_USER(10).advancepay);
DBMS_OUTPUT.PUT_LINE(G_USER(21).mphonecode||’ ’||G_USER(21).advancepay);
DBMS_OUTPUT.PUT_LINE(G_USER(34).mphonecode||’ ’||G_USER(34).advancepay);
DBMS_OUTPUT.PUT_LINE(G_USER(46).mphonecode||’ ’||G_USER(46).advancepay);
DBMS_OUTPUT.PUT_LINE(G_USER(67).mphonecode||’ ’||G_USER(67).advancepay);
DBMS_OUTPUT.PUT_LINE(G_USER(89).mphonecode||’ ’||G_USER(89).advancepay);
END;
四、 表的屬性
count:返回PL/SQL表中行的當前數目。
delete:刪除表中的行。
exists:如果指定的表項在表中存在那麼返回ture。
first:返回表中第一行的索引。
last:返回表中最後一行的索引。
next:返回表中指定行的下一行的索引。
prior:返回表中指定行的上一行的索引。
例如:
DECLARE
-- 定義表型別
TYPE T_USRID_ARRAY IS TABLE OF TF_F_USRARCH_MAIN.USRID%TYPE INDEX BY BINARY_INTEGER;
G_USERID T_USRID_ARRAY;
V_USRID TF_F_USRARCH_MAIN.USRID%TYPE;
BEGIN
SELECT USRID INTO V_USRID FROM TF_F_USRARCH_MAIN WHERE MPHONECODE = ‘13351785505’;
G_USERID(1) := V_USRID;
G_USERID(2) := V_USRID;
G_USERID(10) := V_USRID;
G_USERID(-2) := V_USRID;
DBMS_OUTPUT.PUT_LINE(G_USERID(1));
DBMS_OUTPUT.PUT_LINE(G_USERID(2));
DBMS_OUTPUT.PUT_LINE(G_USERID(10));
DBMS_OUTPUT.PUT_LINE(G_USERID(-2));
DBMS_OUTPUT.PUT_LINE(‘row number sum: ’|| G_USERID.COUNT);
END;
DELETE 屬性會刪除PL/SQL表中的行,TABLE.DELETE會刪除該表中的所有行,TABLE.DELETE(i),從表中刪除由索引i所標記的行,TABLE.DELETE(i,j),從表中刪除位於索引i和j 之間的所有行。
DECLARE
-- 定義表型別
TYPE T_USRID_ARRAY IS TABLE OF TF_F_USRARCH_MAIN.USRID%TYPE INDEX BY BINARY_INTEGER;
G_USERID T_USRID_ARRAY;
V_USRID TF_F_USRARCH_MAIN.USRID%TYPE;
BEGIN
SELECT USRID INTO V_USRID FROM TF_F_USRARCH_MAIN WHERE MPHONECODE = ‘13351785505’;
G_USERID(1) := V_USRID;
G_USERID(2) := V_USRID;
G_USERID(10) := V_USRID;
G_USERID(-2) := V_USRID;
DBMS_OUTPUT.PUT_LINE(G_USERID(1));
DBMS_OUTPUT.PUT_LINE(G_USERID(2));
DBMS_OUTPUT.PUT_LINE(G_USERID(10));
DBMS_OUTPUT.PUT_LINE(G_USERID(-2));
IF G_USERID.EXISTS(1) THEN
DBMS_OUTPUT.PUT_LINE(‘row number(1) exists’);
END IF;
IF G_USERID.EXISTS(9) THEN
DBMS_OUTPUT.PUT_LINE(‘row number(9) exists’);
ELSE
DBMS_OUTPUT.PUT_LINE(‘row number(9) not exists’);
END IF;
END;
DECLARE
-- 定義表型別
TYPE T_USRID_ARRAY IS TABLE OF TF_F_USRARCH_MAIN.USRID%TYPE INDEX BY BINARY_INTEGER;
G_USERID T_USRID_ARRAY;
V_USRID TF_F_USRARCH_MAIN.USRID%TYPE;
V_INDEX BINARY_INTEGER;
BEGIN
SELECT USRID INTO V_USRID FROM TF_F_USRARCH_MAIN WHERE MPHONECODE = ‘13351785505’;
G_USERID(1) := V_USRID;
G_USERID(2) := V_USRID;
G_USERID(10) := V_USRID;
G_USERID(-2) := V_USRID;
DBMS_OUTPUT.PUT_LINE(G_USERID(1));
DBMS_OUTPUT.PUT_LINE(G_USERID(2));
DBMS_OUTPUT.PUT_LINE(G_USERID(10));
DBMS_OUTPUT.PUT_LINE(G_USERID(-2));
V_INDEX := G_USERID.FIRST;
DBMS_OUTPUT.PUT_LINE(‘FIRST ROW INDEX’||’ ’||V_INDEX);
V_INDEX := G_USERID.LAST;
DBMS_OUTPUT.PUT_LINE(‘LAST ROW INDEX’||’ ’||V_INDEX);
END;
DECLARE
-- 定義表型別
TYPE T_USRID_ARRAY IS TABLE OF TF_F_USRARCH_MAIN.USRID%TYPE INDEX BY BINARY_INTEGER;
G_USERID T_USRID_ARRAY;
V_USRID TF_F_USRARCH_MAIN.USRID%TYPE;
V_INDEX BINARY_INTEGER;
BEGIN
SELECT USRID INTO V_USRID FROM TF_F_USRARCH_MAIN WHERE MPHONECODE = ‘13351785505’;
G_USERID(1) := V_USRID;
G_USERID(2) := V_USRID;
G_USERID(10) := V_USRID;
G_USERID(-2) := V_USRID;
V_INDEX := G_USERID.FIRST;
LOOP
DBMS_OUTPUT.PUT_LINE(V_INDEX||’ ‘||G_USERID(V_INDEX));
V_INDEX := G_USERID.NEXT(V_INDEX);
EXIT WHEN V_INDEX = G_USERID.LAST;
END LOOP;
DBMS_OUTPUT.PUT_LINE(G_USERID.LAST||’ ‘|| G_USERID(G_USERID.LAST));
END;
五、 BULK COLLECT 關鍵字的引用
BULK COLLECT是一個PL/SQL語句,而不是SQL語言的一部分。因此,如果想用SQL執行一個BULK COLLECT操作,我必須在一個PL/SQL塊內進行操作。例如:
DECLARE
TYPE UsrId_Array IS TABLE OF NUMBER;
TYPE MphoneCode_Array IS TABLE OF NUMBER;
vusrid UsrId_Array;
vmphonecode MphoneCode_Array;
type test_type is table of tf_f_usrarch_main%rowtype;
CURSOR cur_tf_f_usrarch_main IS
SELECT usrid, mphonecode
FROM tf_f_usrarch_main
WHERE rownum<10;
CURSOR cur_tf_f_usrarch_main1 IS
SELECT *
FROM tf_f_usrarch_main
WHERE rownum<10;
temp NUMBER;
temp1 test_type := test_type();
BEGIN
OPEN cur_tf_f_usrarch_main;
FETCH cur_tf_f_usrarch_main BULK COLLECT INTO vusrid, vmphonecode;
dbms_output.put_line(to_char(vusrid.count));
FOR temp IN 1..vusrid.count
LOOP
dbms_output.put_line(vusrid(temp));
END LOOP;
END;
TYPE T_USRID_ARRAY IS TABLE OF TF_F_USRARCH_MAIN.USRID%TYPE INDEX BY BINARY_INTEGER;
G_USERID T_USRID_ARRAY;
BEGIN
1、PL/SQL表類似於C語言中的陣列。如果要宣告一個PL/SQL表,要先定義該表型別,然後在宣告屬於該型別的變數。
2、理論上,資料庫資料空間有多大,我們的記憶體表就可以儲存多大的資料,就是說他和我們的物理表是相同的,我們可以把物理表的資料完全複製到記憶體表中。
3、PL/SQL表的元素沒有必要按照特定的次序排列,因為他們不是象陣列那樣連續儲存在記憶體中,元素可以按照任意鍵值進行插入。
4、PL/SQL表的鍵值(KEY)沒有必要是順序的。表所佔用的記憶體並不依賴於鍵所使用的數值。
二、 宣告記憶體表
DECLARE
-- 定義表型別
TYPE T_USRID_ARRAY IS TABLE OF TF_F_USRARCH_MAIN.USRID%TYPE INDEX BY BINARY_INTEGER;
G_USERID T_USRID_ARRAY;
BEGIN
NULL;
END;
我們也可以定義表型別為一個表的所有欄位,例如:
DECLARE
-- 主表結構
TYPE T_USRREC IS RECORD(usrid tf_f_usrarch_main.usrid%TYPE,
mphonecode tf_f_usrarch_main.mphonecode%TYPE,
citycode tf_f_usrarch_main.citycode%TYPE,
servicecode tf_f_usrarch_main.servicecode%TYPE,
opendate tf_f_usrarch_main.opendate%TYPE,
firststoptime tf_f_usrarch_main.firststoptime%TYPE,
usrstatecodeset tf_f_usrarch_main.usrstatecodeset%TYPE,
utag3 tf_f_usrarch_main.utag3%TYPE,
callrankcode tf_f_usrarch_main.callrankcode%TYPE,
roamrankcode tf_f_usrarch_main.roamrankcode%TYPE,
advancepay tf_f_usrarch_main.advancepay%TYPE,
ureservvalue tf_f_usrarch_main.ureservvalue%TYPE,
creditfactor5 tf_f_usrarch_main.creditfactor5%TYPE);
-- 定義表型別
TYPE T_USRREC_ARRAY IS TABLE OF T_USRREC INDEX BY BINARY_INTEGER;
G_USERID T_USRREC_ARRAY;
BEGIN
NULL;
END;
三、 對錶型別的引用
DECLARE
-- 定義表型別
TYPE T_USRID_ARRAY IS TABLE OF TF_F_USRARCH_MAIN.USRID%TYPE INDEX BY BINARY_INTEGER;
G_USERID T_USRID_ARRAY;
V_USRID TF_F_USRARCH_MAIN.USRID%TYPE;
BEGIN
SELECT USRID INTO V_USRID FROM TF_F_USRARCH_MAIN WHERE MPHONECODE = ‘13351785505’;
G_USERID(1) := V_USRID;
G_USERID(2) := V_USRID;
G_USERID(10) := V_USRID;
G_USERID(-2) := V_USRID;
DBMS_OUTPUT.PUT_LINE(G_USERID(1));
DBMS_OUTPUT.PUT_LINE(G_USERID(2));
DBMS_OUTPUT.PUT_LINE(G_USERID(10));
DBMS_OUTPUT.PUT_LINE(G_USERID(-2));
END;
執行時設定:set serveroutput on
DECLARE
-- 主表結構
TYPE T_USRREC IS RECORD(usrid tf_f_usrarch_main.usrid%TYPE,
mphonecode tf_f_usrarch_main.mphonecode%TYPE,
citycode tf_f_usrarch_main.citycode%TYPE,
servicecode tf_f_usrarch_main.servicecode%TYPE,
opendate tf_f_usrarch_main.opendate%TYPE,
firststoptime tf_f_usrarch_main.firststoptime%TYPE,
usrstatecodeset tf_f_usrarch_main.usrstatecodeset%TYPE,
utag3 tf_f_usrarch_main.utag3%TYPE,
callrankcode tf_f_usrarch_main.callrankcode%TYPE,
roamrankcode tf_f_usrarch_main.roamrankcode%TYPE,
advancepay tf_f_usrarch_main.advancepay%TYPE,
ureservvalue tf_f_usrarch_main.ureservvalue%TYPE,
creditfactor5 tf_f_usrarch_main.creditfactor5%TYPE);
-- 定義遊標型別
TYPE T_USRREC_CUR IS REF CURSOR;
RETURN T_USRREC;
-- 定義表型別
TYPE T_USRREC_ARRAY IS TABLE OF T_USRREC INDEX BY BINARY_INTEGER;
-- 定義遊標
CUR_TF_F_USRARCH_MAIN T_USRREC_CUR;
-- 定義記憶體表
G_USER T_USRREC_ARRAY;
PersonKind T_USRREC;
v_cur BINARY_INTEGER;
BEGIN
v_cur := 0;
OPEN cur_tf_f_usrarch_main
FOR SELECT usrid,
mphonecode,
citycode,
servicecode,
opendate,
firststoptime,
SUBSTR(usrstatecodeset,-1,1),
utag3,
callrankcode,
roamrankcode,
advancepay,
ureservvalue,
creditfactor5
FROM tf_f_usrarch_main
WHERE removetag = '0'
AND substr(usrid, -2, 2) = '00'
AND rownum<100;
LOOP
v_cur := v_cur+1;
FETCH cur_tf_f_usrarch_main INTO PersonKind;
EXIT WHEN cur_tf_f_usrarch_main%NOTFOUND;
G_USER(v_cur).usrid := PersonKind.usrid;
G_USER(v_cur).mphonecode := PersonKind.mphonecode;
G_USER(v_cur).citycode := PersonKind.citycode;
G_USER(v_cur).servicecode := PersonKind.servicecode;
G_USER(v_cur).opendate := PersonKind.opendate;
G_USER(v_cur).firststoptime := PersonKind.firststoptime;
G_USER(v_cur).usrstatecodeset := PersonKind.usrstatecodeset;
G_USER(v_cur).utag3 := PersonKind.utag3;
G_USER(v_cur).callrankcode := PersonKind.callrankcode;
G_USER(v_cur).roamrankcode := PersonKind.roamrankcode;
G_USER(v_cur).advancepay := PersonKind.advancepay;
G_USER(v_cur).ureservvalue := PersonKind.ureservvalue;
G_USER(v_cur).creditfactor5 := PersonKind.creditfactor5;
END LOOP;
CLOSE cur_tf_f_usrarch_main;
DBMS_OUTPUT.PUT_LINE(G_USER(1).mphonecode||’ ’||G_USER(1).advancepay);
DBMS_OUTPUT.PUT_LINE(G_USER(2).mphonecode||’ ’||G_USER(2).advancepay);
DBMS_OUTPUT.PUT_LINE(G_USER(3).mphonecode||’ ’||G_USER(3).advancepay);
DBMS_OUTPUT.PUT_LINE(G_USER(10).mphonecode||’ ’||G_USER(10).advancepay);
DBMS_OUTPUT.PUT_LINE(G_USER(21).mphonecode||’ ’||G_USER(21).advancepay);
DBMS_OUTPUT.PUT_LINE(G_USER(34).mphonecode||’ ’||G_USER(34).advancepay);
DBMS_OUTPUT.PUT_LINE(G_USER(46).mphonecode||’ ’||G_USER(46).advancepay);
DBMS_OUTPUT.PUT_LINE(G_USER(67).mphonecode||’ ’||G_USER(67).advancepay);
DBMS_OUTPUT.PUT_LINE(G_USER(89).mphonecode||’ ’||G_USER(89).advancepay);
END;
四、 表的屬性
count:返回PL/SQL表中行的當前數目。
delete:刪除表中的行。
exists:如果指定的表項在表中存在那麼返回ture。
first:返回表中第一行的索引。
last:返回表中最後一行的索引。
next:返回表中指定行的下一行的索引。
prior:返回表中指定行的上一行的索引。
例如:
DECLARE
-- 定義表型別
TYPE T_USRID_ARRAY IS TABLE OF TF_F_USRARCH_MAIN.USRID%TYPE INDEX BY BINARY_INTEGER;
G_USERID T_USRID_ARRAY;
V_USRID TF_F_USRARCH_MAIN.USRID%TYPE;
BEGIN
SELECT USRID INTO V_USRID FROM TF_F_USRARCH_MAIN WHERE MPHONECODE = ‘13351785505’;
G_USERID(1) := V_USRID;
G_USERID(2) := V_USRID;
G_USERID(10) := V_USRID;
G_USERID(-2) := V_USRID;
DBMS_OUTPUT.PUT_LINE(G_USERID(1));
DBMS_OUTPUT.PUT_LINE(G_USERID(2));
DBMS_OUTPUT.PUT_LINE(G_USERID(10));
DBMS_OUTPUT.PUT_LINE(G_USERID(-2));
DBMS_OUTPUT.PUT_LINE(‘row number sum: ’|| G_USERID.COUNT);
END;
DELETE 屬性會刪除PL/SQL表中的行,TABLE.DELETE會刪除該表中的所有行,TABLE.DELETE(i),從表中刪除由索引i所標記的行,TABLE.DELETE(i,j),從表中刪除位於索引i和j 之間的所有行。
DECLARE
-- 定義表型別
TYPE T_USRID_ARRAY IS TABLE OF TF_F_USRARCH_MAIN.USRID%TYPE INDEX BY BINARY_INTEGER;
G_USERID T_USRID_ARRAY;
V_USRID TF_F_USRARCH_MAIN.USRID%TYPE;
BEGIN
SELECT USRID INTO V_USRID FROM TF_F_USRARCH_MAIN WHERE MPHONECODE = ‘13351785505’;
G_USERID(1) := V_USRID;
G_USERID(2) := V_USRID;
G_USERID(10) := V_USRID;
G_USERID(-2) := V_USRID;
DBMS_OUTPUT.PUT_LINE(G_USERID(1));
DBMS_OUTPUT.PUT_LINE(G_USERID(2));
DBMS_OUTPUT.PUT_LINE(G_USERID(10));
DBMS_OUTPUT.PUT_LINE(G_USERID(-2));
IF G_USERID.EXISTS(1) THEN
DBMS_OUTPUT.PUT_LINE(‘row number(1) exists’);
END IF;
IF G_USERID.EXISTS(9) THEN
DBMS_OUTPUT.PUT_LINE(‘row number(9) exists’);
ELSE
DBMS_OUTPUT.PUT_LINE(‘row number(9) not exists’);
END IF;
END;
DECLARE
-- 定義表型別
TYPE T_USRID_ARRAY IS TABLE OF TF_F_USRARCH_MAIN.USRID%TYPE INDEX BY BINARY_INTEGER;
G_USERID T_USRID_ARRAY;
V_USRID TF_F_USRARCH_MAIN.USRID%TYPE;
V_INDEX BINARY_INTEGER;
BEGIN
SELECT USRID INTO V_USRID FROM TF_F_USRARCH_MAIN WHERE MPHONECODE = ‘13351785505’;
G_USERID(1) := V_USRID;
G_USERID(2) := V_USRID;
G_USERID(10) := V_USRID;
G_USERID(-2) := V_USRID;
DBMS_OUTPUT.PUT_LINE(G_USERID(1));
DBMS_OUTPUT.PUT_LINE(G_USERID(2));
DBMS_OUTPUT.PUT_LINE(G_USERID(10));
DBMS_OUTPUT.PUT_LINE(G_USERID(-2));
V_INDEX := G_USERID.FIRST;
DBMS_OUTPUT.PUT_LINE(‘FIRST ROW INDEX’||’ ’||V_INDEX);
V_INDEX := G_USERID.LAST;
DBMS_OUTPUT.PUT_LINE(‘LAST ROW INDEX’||’ ’||V_INDEX);
END;
DECLARE
-- 定義表型別
TYPE T_USRID_ARRAY IS TABLE OF TF_F_USRARCH_MAIN.USRID%TYPE INDEX BY BINARY_INTEGER;
G_USERID T_USRID_ARRAY;
V_USRID TF_F_USRARCH_MAIN.USRID%TYPE;
V_INDEX BINARY_INTEGER;
BEGIN
SELECT USRID INTO V_USRID FROM TF_F_USRARCH_MAIN WHERE MPHONECODE = ‘13351785505’;
G_USERID(1) := V_USRID;
G_USERID(2) := V_USRID;
G_USERID(10) := V_USRID;
G_USERID(-2) := V_USRID;
V_INDEX := G_USERID.FIRST;
LOOP
DBMS_OUTPUT.PUT_LINE(V_INDEX||’ ‘||G_USERID(V_INDEX));
V_INDEX := G_USERID.NEXT(V_INDEX);
EXIT WHEN V_INDEX = G_USERID.LAST;
END LOOP;
DBMS_OUTPUT.PUT_LINE(G_USERID.LAST||’ ‘|| G_USERID(G_USERID.LAST));
END;
五、 BULK COLLECT 關鍵字的引用
BULK COLLECT是一個PL/SQL語句,而不是SQL語言的一部分。因此,如果想用SQL執行一個BULK COLLECT操作,我必須在一個PL/SQL塊內進行操作。例如:
DECLARE
TYPE UsrId_Array IS TABLE OF NUMBER;
TYPE MphoneCode_Array IS TABLE OF NUMBER;
vusrid UsrId_Array;
vmphonecode MphoneCode_Array;
type test_type is table of tf_f_usrarch_main%rowtype;
CURSOR cur_tf_f_usrarch_main IS
SELECT usrid, mphonecode
FROM tf_f_usrarch_main
WHERE rownum<10;
CURSOR cur_tf_f_usrarch_main1 IS
SELECT *
FROM tf_f_usrarch_main
WHERE rownum<10;
temp NUMBER;
temp1 test_type := test_type();
BEGIN
OPEN cur_tf_f_usrarch_main;
FETCH cur_tf_f_usrarch_main BULK COLLECT INTO vusrid, vmphonecode;
dbms_output.put_line(to_char(vusrid.count));
FOR temp IN 1..vusrid.count
LOOP
dbms_output.put_line(vusrid(temp));
END LOOP;
END;
TYPE T_USRID_ARRAY IS TABLE OF TF_F_USRARCH_MAIN.USRID%TYPE INDEX BY BINARY_INTEGER;
G_USERID T_USRID_ARRAY;
BEGIN
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-961600/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【Oracle-記憶體管理】-Multiple Block SizesOracle記憶體BloC
- 【Oracle-記憶體管理】-Multiple I/O SlavesOracle記憶體
- 【轉載】MySQL之臨時表和記憶體表MySql記憶體
- 讀書筆記:深入解析oracle-第5章 記憶體管理筆記Oracle記憶體
- mysql最大表記憶體MySql記憶體
- 【Oracle-記憶體管理】-DB Blocks gets,Consistent gets And Physical readsOracle記憶體BloC
- [轉載] Java直接記憶體與堆記憶體Java記憶體
- mysql臨時表和記憶體表MySql記憶體
- 記憶體技術詞彙表記憶體
- 堆記憶體和棧記憶體詳解(轉載)記憶體
- JAVA記憶體管理 [轉]Java記憶體
- 轉:Oracle 記憶體分析Oracle記憶體
- mysql cluster ndb 記憶體表和磁碟表MySql記憶體
- 【轉】java中的記憶體溢位和記憶體洩漏Java記憶體溢位
- 記憶體分配方式 (轉)記憶體
- 記憶體管理之五 (轉)記憶體
- 記憶體管理之一 (轉)記憶體
- 記憶體管理原始碼 (轉)記憶體原始碼
- Windows CE記憶體管理 (轉)Windows記憶體
- Solaris記憶體監控(轉)記憶體
- 記憶體表和臨時表的區別記憶體
- optee記憶體管理和頁表建立記憶體
- MySQL-37:記憶體臨時表MySql記憶體
- Redis記憶體——記憶體消耗(記憶體都去哪了?)Redis記憶體
- (轉)快閃記憶體表空間 VS 資料庫Flash Cache記憶體資料庫
- 記憶體_大頁記憶體記憶體
- PL/SQL表(oracle記憶體表)---table()函式用法SQLOracle記憶體函式
- Perfdog 玩轉記憶體洩漏記憶體
- 轉 linux 記憶體釋放Linux記憶體
- 【轉】Java的記憶體洩漏Java記憶體
- aix記憶體最佳化(轉)AI記憶體
- 走出虛擬記憶體禁(轉)記憶體
- 轉載——C++記憶體管理C++記憶體
- 讀寫CMOS記憶體 (轉)記憶體
- UNIX共享記憶體的程式(轉)記憶體
- 改善SQL Server記憶體管理(轉)SQLServer記憶體
- [轉帖]Solaris記憶體管理以及判定記憶體是否夠用的方法記憶體
- Linux記憶體使用的體會(轉)Linux記憶體