關於ORACLE中的數組:記錄同集合sql
集合能夠有三種實現方式:數據庫
1 自定義一個TYPE使用VARRAY來獲得一個數組但只能對基本類型定義如:數組
CREATE TYPE 類型名 AS VARRAY OF VARCHAR2(20);ide
1 自定義一個TYPE使用VARRAY來獲得一個數組但只能對基本類型定義如:函數
CREATE TYPE 類型名 AS VARRAY(52) OF VARCHAR2(20);oop
不能使用以下:fetch
CREATE TYPE 類型名 AS VARRAY(52) OF 表名%ROWTYPE;code
注意:使用VARRAY時必定要先指定數組大小server
否則搞建立數組類型對象
2 內嵌表如:
?TYPE 類型名 IS TABLE OF 具體類型如:(表名%ROWTYPE);
?內嵌表數組分二種:Index_by表同嵌套表如上的就是嵌套表而Index_by表只要在其尾回上 INDEX BY BINARY_INTEGER就能夠了
例子:
declare
cursor cur_test is select id,mc from test;
type t_test1 is table of varchar2(60) index by binary_integer;
type t_test2 is table of test%rowtype index by binary_integer;
var_test1 t_test1;
var_test2 t_test2;
var_new t_test2;
begin
SELECT id,mc INTO var_test2(0) FROM test WHERE id='111';
dbms_output.put_line('var_test2(0):'||var_test2(0).id||'---'||var_test2(0).mc);
SELECT id,mc INTO var_test2(8) FROM test WHERE id='333';
dbms_output.put_line('var_test2(8):'||var_test2(8).id||'---'||var_test2(8).mc);
var_new := var_test2;
dbms_output.put_line('===== copy var_test2 to var_new =====');
dbms_output.put_line('var_new(0):'||var_new(0).id||'---'||var_new(0).mc);
dbms_output.put_line('var_new(8):'||var_new(8).id||'---'||var_new(8).mc);
end;
===================================================================================
DECLARE
TYPE t_test1 IS TABLE OF test.id%TYPE;
TYPE t_test2 IS VARRAY (10) OF test.id%TYPE;
var_test1 t_test1;
var_test2 t_test2;
begin
--var_test1(1) := ('test1.1'); --沒有初始化不能賦值
var_test1 := t_test1('test1.1','test1.2','test1.3');
dbms_output.put_line('var_test1: '||var_test1(1)||','||var_test1(2)||','||var_test1(3));
var_test2 := t_test2('test2.1','test2.2','test2.3');
dbms_output.put_line('var_test2: '||var_test2(1)||','||var_test2(2)||','||var_test2(3));
var_test1(2) := 'test1.2_update';
dbms_output.put_line('==== 修改了var_test1(2) ====');
dbms_output.put_line('var_test1: '||var_test1(1)||','||var_test1(2)||','||var_test1(3));
dbms_output.put_line(var_test1.next(3));
dbms_output.put_line('var_test2元素個數: '||var_test2.limit());
end;
嵌套表的元素能夠是集合,注意賦值的時候是varray_element.record_column := 的形式.
除了構造函數外,集合還有不少內建函數,按照面向對象編成的叫法稱之爲方法。
方法==========描述====================================================================使用限制
COUNT=========返回集合中元素的個數
DELETE========刪除集合中全部元素
DELETE(x)=====刪除元素下標爲x的元素===================================================對VARRAY非法
DELETE(x,y)===刪除元素下標從X到Y的元素================================================對VARRAY非法
EXIST(x)======若是集合元素x已經初始化,則返回TRUE, 不然返回FALSE
EXTEND========在集合末尾添加一個元素==================================================對Index_by非法
EXTEND(x)=====在集合末尾添加x個元素===================================================對Index_by非法
EXTEND(x,n)===在集合末尾添加元素n的x個副本============================================對Index_by非法
FIRST=========返回集合中的第一個元素的下標號,對於VARRAY集合始終返回1。
LAST==========返回集合中最後一個元素的下標號, 對於VARRAY返回值始終等於COUNT.
LIMIT=========返回VARRY集合的最大的元素個數===========================================Index_by集合和嵌套表無用
NEXT(x)=======返回在第x個元素以後及緊挨着它的元素的值,若是x是最後一個元素,返回null.
PRIOR(x)======返回在第x個元素以前緊挨着它的元素的值,若是x是第一個元素,則返回null。
TRIM==========從集合末端開始刪除一個元素==============================================對於index_by不合法
TRIM(x)=======從集合末端開始刪除x個元素===============================================對index_by不合法
********************************************************************************************
記錄能夠定義爲:
TYPE 類型名 IS RECORDER (具休類型)
也可用:變量名 表名%ROWTYPE
例子:
隱式定義記錄中,咱們不用描述記錄的每個域,在聲明記錄變量時使用%ROWTYPE命令定義與數據庫表,視圖,遊標有相同結構的記錄。
有一些PL/SQL指令在使用隱式定義記錄時沒有使用%ROWTYPE屬性,好比遊標FOR循環或觸發器中的:old和:new記錄
declare
t_record1 test%rowtype;
cursor cur_test(v_id in varchar2) is
select id,mc from test
where id <= v_id;
t_record2 cur_test%rowtype;
begin
for row_test in cur_test('333') loop
t_record1.id := row_test.id;
t_record1.mc := row_test.mc;
t_record2.id := row_test.id;
t_record2.mc := row_test.id;
dbms_output.put_line('t_record1:'||t_record1.id||'---'||t_record1.mc);
dbms_output.put_line('t_record2:'||t_record2.id||'---'||t_record2.mc);
dbms_output.put_line('row_test:'||row_test.id||'---'||row_test.mc);
dbms_output.put_line('================loop '||cur_test%rowcount||' times.');
end loop;
exception when others then
dbms_output.put_line(sqlcode||sqlerrm);
end;
======================================================================================
declare
type t_record is record
(
id test.id%type,
mc test.mc%type
);
var_record t_record;
counter number default 0;
begin
for row_test in (select id,mc from test) loop
counter := counter + 1;
var_record.id := row_test.id;
var_record.mc := row_test.mc;
dbms_output.put_line('var_record:'||var_record.id||'---'||var_record.mc);
dbms_output.put_line('row_test:'||row_test.id||'---'||row_test.mc);
dbms_output.put_line('================loop '||counter||' times.');
end loop;
exception when others then
dbms_output.put_line(sqlcode||sqlerrm);
end;
3、綜合實例BULK COLLECT的用法
*/
set serverout on
DECLARE
TYPE t_record IS RECORD (
id number(18,0),
mc varchar2(50)
);
var_record t_record;
type t_test is table of t_record;
var_test t_test := t_test();
cursor cur_test is select id,mc from test;
begin
open cur_test;
fetch cur_test BULK COLLECT INTO var_test;
for i in 1..var_test.count() loop
dbms_output.put_line(var_test(i).id||'---'||var_test(i).mc);
end loop;
end;