Oracle:集合(一)

集合

集合有3中類型:

  • 變長數組:類似於java中的數組。可存儲有序的元素集合,每個元素都有一個索引,記錄了元素在數組中的位置。只能作爲整體來修改。在創建時創建時可設置最大大小,但是後期可以更改。
  • 嵌套表:嵌套在另一個表中的表。可以插入、更新和刪除嵌套標表中的單個元素。沒有最大大小,可以再嵌套表中存儲任意數目的元素。
  • 關聯數組(以前稱爲索引表);類似於java中的散列表。是個鍵值對集合。關聯數組只能用於PL/SQL中,不能存儲在數據庫中。

一.創建集合類型

1.創建變長數組類型

既可以是內置的數據庫類型,也可以是用戶定義的對象類型。

crete type t_varray_address as varray(3) of varchar2(50);

修改最大大小,將最大元素個數改爲10

alter type t_varray_address modify limit 10 cascade;

2.創建嵌套表類型

create type t_address as object (
    street varchar2(15),
    city varchar2(15),
    state char(2),
    zip varchar2(5)
);
create type t_nested_table_address as table of t_address;

二.使用集合類型定義表列

1.使用變長數組類型定義表列

create table customer_with_varry (
    id integer primary key,
    first_name varchar(10),
    last_name varchar(10),
    addresses t_varray_address
);

注意:當變長數組的大小小於4000字節時,變長數組的元素直接存儲在表中;否則,變長數組存儲在表之外。當變長數組存儲在表中時,它的元素訪問速度比嵌套表的元素訪問速度快。

2.使用嵌套表類型定義表列

create table customer_with_nested_tabel (
    id integer primary key,
    first_name varchar(10),
    last_name varchar(10),
    addresses t_nested_table_address
)
nested table
    addresses
store as
    nested_addresses;

三.獲取集合信息

1.獲取變長數組信息

describe t_varray_address
t_varray_address varray(3) of varchar2(50);
select * from user_varrays where type_name='t_varray_address';

2.獲得嵌套表信息

describe t_nested_table_address
select * 
from user_nested_tables 
where table_name='nested_addresses';

四.填充集合元素

1.填充變長數組元素

insert into customer_with_varry values (
    1, 'Steve', 'Brown',
        t_varray_address (
            '2 State Street, Beantown, MA, 12345'
    )
);

2.填充嵌套表元素

insert into customer_with_nested_tabel values(
    1, 'Steve', 'Brown',
        t_nested_table_address (
            t_address('2 State Street, Beantown, MA, 12345')
        )
);

五.檢索集合元素

1.檢索變長數組元素

select * 
from customer_with_varry 
where id = 1;


ID     FIRST_NMAE   LAST_NAME   ASSRESSES
-----------------------------------------------------------
1      Steve         Brown      t_varray_address('2 State Street, Beantown, MA, 12345')

2.檢索嵌套表元素

select * 
from customer_with_nested_tabel 
where id = 1;

ID   FIRST_NMAE   LAST_NAME   ASSRESSES
-----------------------------------------------------------------
1    Steve        Brown      t_nested_table_address(t_address('2 State Street, Beantown, MA, 12345'))

六.使用table()函數將集合視爲一系列行

1.將table()函數應用於變長數組

select a.* 
from customer_with_varry c, table(c.addresses) a 
where id = 1;

COLUMN_VALUE
-----------------------------------
2 State Street, Beantown, MA, 12345
select * 
from table(
    select addresses 
    where id = 1
    );

COLUMN_VALUE
-----------------------------------
2 State Street, Beantown, MA, 12345

2.將table()函數應用於嵌套表

select a.* 
from customer_with_nested_tabel c, table(c.addresses) a 
where id = 1;

STREET           CITY      ST   ZIP
-------------------------------------
2 State Street   Beantown  MA   12345

七.更改集合元素

1.更改變長數組元素

注意:只能作爲整體來修改

update customer_with_varry
set addresses = t_varray_address(
    'ShengXia Streest, Shanghai, CA, 3346',
    'ZuChongZhi Streest, Shanghai, CA, 8978'
)
where id = 1;

2.更改嵌套表元素

insert into table(
    select addresses
    from customer_with_nested_tabel
    where id = 1
) values (
    t_address('5 Main Streest', 'Uptonwn', 'NY', '55512')
);
update table(
    select addresses
    from customer_with_nested_tabel
    where id = 1
) addr
    set values(addr) = 
    t_address('ShengXia Streest', 'Shanghai', 'CA', '3346')
    where value(addr) =
    t_address('5 Main Streest', 'Uptonwn', 'NY', '55512');
delete from table(
    select addresses
    from customer_with_nested_tabel
    where id = 1
)addr
    where value(addr) = 
    t_address('ShengXia Streest', 'Shanghai', 'CA', '3346')

八.使用映射方法比較嵌套表的內容

注意:變長數組的類型不能直接比較

滿足以下三個條件,兩個嵌套表才相等:

  1. 兩個嵌套表具有相同的類型
  2. 兩個嵌套表具有相同的行數
  3. 兩個嵌套表的所有元素的值都相同

如果嵌套表是內置數據庫類型,那麼數據庫會自動比較嵌套表的內容。如果嵌套表的元素時用戶定義的對象類型,那麼需要提供映射函數。

create type t_address2 as object (
    street varchar2(15),
    city varchar2(15),
    state char(2),
    zip varchar2(5),
    map member function get_string return varchar2
);
create type body t_address2 as
    map member function get_string return varchar2 is
begin
    return zip || ' '||state||' '||city||' '||street;
    end get_string;
end;

使用submultiset of比較是否一個嵌套表的內容是另一個的子集

九.使用CAST()函數將集合從一種類型轉換爲另一種類型

1.使用CAST()函數將變長數組轉換爲嵌套表

select cast(cv.addresses as t_nested_table_address)
from customer_with_varry cv
where cv.id = 1;

2.使用CAST()函數將嵌套錶轉換爲變長數組

select cast(cv.addresses as customer_with_varry)
from t_nested_table_address cv
where cv.id = 1;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章