oralce/plsql數組的幾種定義

關於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;

相關文章
相關標籤/搜索