Oracle集合类型介绍


Oracle集合类型介绍
 
集合类型
 
1. 使用条件:
   a. 单行单列的数据,使用标量变量 。 
   b. 单行多列数据,使用记录 [ 详细讲解请见:  点击打开链接http://www.2cto.com/database/201210/163097.html ]
   c. 单列多行数据,使用集合
       *集合:类似于 编程语言中数组也就是。pl/sql集合类型包括关联数组Associative array(索引表 pl/sql table)、嵌套表(Nested Table)、变长数组(VARRAY)。
  www.2cto.com  
2. 三种集合类型区别:
 
     Nested table与VARRY既可以被用于PL/SQL,也可以被直接用于 数据库中,但是Associative array不行,也就是说,Associative array是不能通过CREATE TYPE语句进行单独创建,只能在PL/SQL块(或Package)中进行定义并使用(即适用范围是PL/SQL Block级别),而Nested table与VARRAY则可以使用CREATE TYPE进行创建(即适用范围是Schema级别),它们还可以直接作为数据库表中列的类型。
 
3.  集合的方法:
  www.2cto.com  
       exists(index) 索引处的元素是否存在  
       count 当前集合中的元素总个数  
       limit 集合元素索引的最大值  
          索引表和嵌套表是不限个数的,所以返回null,变长数组返回定义时的最大索引  
       first  返回集合第一个元素索引  
       last  返回集合最后一个元素索引  
       prior 当前元素的前一个  
       next 当前元素的后一个  
      
       extend 扩展集合的容量,增加元素 只是用于嵌套表和varry类型  
           x.extend 增加一个null元素  
           x.extend(n) 增加n个null元素  
           x.extend(n,i) 增加n个元素,元素值与第i个元素相同  
       trim 从集合的尾部删除元素 只用于NEST TABLE和VARRY类型  
       trim 从集合尾部删除一个元素  
       trim(n) 从集合尾部删除n个元素  
       delete 按索引删除集合元素  
           delete 删除所有  
           delete(index) 删除第index个  
           delete(a,b) 删除a--b之间的所有元素 
 
4.  集合类型的声明与初始化:
 
    1)关联数组:
         a. 下标无限制,可以为负数  
         b. 元素个数无限制  
         c.  定义  
              TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY key_type;  
              type_name:用户自定义数据类型的名字  
              element_type:索引表中元素类型  
              key_type:索引表元素下标的数据类型(BINARY_INTEGER,PLS_INTEGER,VARCHAR2) 
 
         d. 例1:
  www.2cto.com  
[sql] 
declare  
  type index_tab_type is table of varchar2(30) index by BINARY_INTEGER;  
  v_table index_tab_type;  
begin  
  v_table(-1) :='hello';--设定下标为-1的元素的值  
  v_table(1)  :=',';  
  dbms_output.put_line(v_table(-1)||'-'||v_table(1));  
  dbms_output.put_line('元素个数:'||v_table.count);  
  v_table(5) :='world';  
  dbms_output.put_line('元素个数:'||v_table.count);  
  dbms_output.put_line('第一个元素'||v_table.first);  
  dbms_output.put_line('最后一个元素'||v_table.last);  
end;  
/  
[sql] 
hello-,  
元素个数:2  
元素个数:3  
第一个元素-1  
最后一个元素5  
www.2cto.com  
PL/SQL 过程已成功完成。  
         e.例2:使用varchar2作为索引元素类型 ,其实也就和java中的map一样了 key-value(键值对)形式存储
[sql] 
declare  
  type index_tab_type is table of varchar2(30) index by varchar2(30);  
  v_table index_tab_type;  
  v_record emp%rowtype;  
begin  
  --emp表中查询3条记录,以name-job的形式存储到索引表中  
  select * into v_record from emp where emp.empno=7788;  
  v_table(v_record.ename):= v_record.job;  
  select * into v_record from emp where emp.empno=7844;  
  v_table(v_record.ename):= v_record.job;  
  select * into v_record from emp where emp.empno=7900;  
  v_table(v_record.ename):= v_record.job;  
  dbms_output.put_line(v_table.count);--3  
  dbms_output.put_line(v_table(v_record.ename));--CLERK  
end;  
/  
[sql] 
3  
CLERK  
  
PL/SQL 过程已成功完成。  
 
     2)嵌套表 Nested Table
         a. 下标从1开始,元素个数灭有限制(*使用时必须先初始化,用extend属性可以扩展元素个数)  
         b.  可以作为表定义数据类型,但是前提是要先create 创造嵌套表类型,这就可以实现1对多了定义  
                TYPE type_name IS TABLE OF element_type;  
         c.  和索引表的区别也就是看看有无index by语句,嵌套表的索引固定是int型的 . 
         d.例1:
  www.2cto.com  
[sql] 
declare  
     type nest_table_type is table of emp.ename%type;  
     v_nest_tab nest_table_type;  
begin  
     v_nest_tab :=nest_table_type('x');--初始化 必须! 语句 type_name(...)  
     select ename into v_nest_tab(1) from emp where empno=7788;  
     dbms_output.put_line(v_nest_tab(1));  
end;  
 
[sql] 
SCOTT  
  
PL/SQL 过程已成功完成。  
 
          e.例2:在表列中使用嵌套表 嵌套表类型的列是单独一个表存储,先创建一个这样的类型才能使用
  www.2cto.com  
[sql] 
 create type nest_tab_type is table of varchar2(30);     
  create table test_nest_tab(    
     id int,    
     vals nest_tab_type --使用    
  ) nested table vals store as nest_tab;--vals字段用嵌套表存储,表明nest_tab    
  --上面语句执行完之后,在生成TEST_NEST_TAB的同时会生出一个关联表NEST_TAB用来存储关联表的数据    
--插入数据    
insert into test_nest_tab values(1,nest_tab_type('one','two','three','four'));    
--查询数据    
declare     
  v_id int;    
  v_tab nest_tab_type;    
begin    
  select * into v_id,v_tab from test_nest_tab where id=1;    
  dbms_output.put_line(v_id);    
  for i in 1..v_tab.count loop    
  dbms_output.put_line(v_tab(i));    
  end loop;    
end;    
 
[sql] 
1  
one  
two  
three  
four  
  
PL/SQL 过程已成功完成。  
 
      3)Varry 可变数组 
        a. 定义  
             TYPE type_name IS VARRAY(size_limit) OF element_type[NOT NULL];  
        b.  这个就和java中的数组差不多了,下标from 1 ,定义时先指定最大元素个数,也和varchar2(size)这种一样。  
        c.  使用时也必须先用构造方法初始化 ,可以作为表列类型  
        d.  例1:
  www.2cto.com  
[sql] 
declare  
  type varr is VARRAY(10) of int;  
  v_varr varr :=varr();  
begin  
  --dbms_output.put_line(varr.count);  
  for i in 1..5 loop  
      v_varr.extend;  
      v_varr(i) :=i*i;  
  end loop;  
  
  for i in 1..5 loop  
      dbms_output.put_line(v_varr(i));  
  end loop;  
end;  
/  
 
[sql] 
1  
4  
9  
16  
25  
  
PL/SQL 过程已成功完成。  
  www.2cto.com  
            e.例2:可变数组作为表列类型 可变数组是存储在表内部的,不同于嵌套表
[sql] 
create type varr_type is varray(10) of varchar2(30);--先创建类型    
create table test_varray(    
    id int,    
    name varchar2(30),    
    params varr_type --param是使用可变数组类型    
);    
--插入数据    
insert into test_varray values(1,'bird',varr_type('a','b','c'));    
--查询数据    
declare     
    v_varr varr_type;    
    v_name test_varray.name%type;    
begin    
    select name,params into v_name,v_varr from test_varray where id=1;    
    for i in 1..v_varr.count loop    
    dbms_output.put_line(v_varr(i));    
    end loop;    
end;   
 
[sql] 
a  
b  
c  
  
PL/SQL 过程已成功完成。  
  www.2cto.com  
5. 如何选择适用的集合类型:
 
       通常来说,对集合类型的第一选择应该是Associative array,因为它不需要初始化或者EXTEND操作,并且是迄今为止最高效的集合类型。唯一不足的一点是它只能用于PL/SQL而不能直接用于数据库。
 
  如果你需要允许使用负数索引,应该选择Associative array;
 
  如果你需要使用10g,11g中的那些集合操作,应该选择Nested table;
 
  如果你需要限制集合元素的个数,应该选择VARRAY
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Oracle 中,您可以使用 `INSERT INTO` 语句来向表中插入新记录。具体语法如下: ``` INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...); ``` 您可以将多个值插入到表中,只需在 `VALUES` 子句中提供多个用逗号分隔的列表即可。例如: ``` INSERT INTO products (name, price) VALUES ('Computer', 1000), ('Tablet', 500), ('Phone', 800); ``` 注意,在这种情况下,每个值列表都必须具有相同数量的值,因为所有值都是插入到相同的表中的。 如果需要,您还可以使用 `INSERT INTO SELECT` 语句从另一个表中选择数据并插入到当前表中。例如: ``` INSERT INTO table1 (column1, column2, ...) SELECT column1, column2, ... FROM table2 WHERE condition; ``` 这将从表2中选择所有满足条件的行,并将这些行插入到表1中。 希望这些信息对您有所帮助! ### 回答2: 在Oracle中,可以通过多种方式插入集合。 方法一:使用INSERT ALL和SELECT FROM DUAL插入多个记录。 例如,假设我们有一个包含以下列的表my_table:id,name和age。我们想要插入多个记录,我们可以使用以下语法: INSERT ALL INTO my_table (id, name, age) VALUES (1, 'John', 25) INTO my_table (id, name, age) VALUES (2, 'Mary', 30) INTO my_table (id, name, age) VALUES (3, 'David', 35) SELECT * FROM DUAL; 这将在my_table中插入三条记录,每条记录都由不同的id,name和age组成。 方法二:使用INSERT INTO SELECT语句插入单个记录。 例如,假设我们有一个集合类my_collection_type,它定义为CREATE TYPE my_collection_type AS VARRAY(10) OF VARCHAR2(100)。我们想要将一个集合插入到my_table中的某一行中,我们可以使用以下语法: INSERT INTO my_table (id, name, age, my_collection) SELECT id, name, age, my_collection_type('item1', 'item2', 'item3') FROM my_table WHERE name = 'John'; 这将在my_table中选择name为'John'的行,然后将my_collection_type('item1', 'item2', 'item3')插入到匹配的行中的my_collection列中。 需要注意的是,如果我们想要插入的集合是表级集合(nested table),我们需要先使用CREATE TYPE语句创建一个嵌套表类,并将其与表关联起来,然后使用INSERT INTO语句将集合插入到表中。 除了以上两种方法,还可以使用PL/SQL块或存储过程来插入集合。在PL/SQL中,我们可以使用BULK COLLECT语句来一次性插入多个集合元素。 总结起来,Oracle提供了多种方式来插入集合数据,我们可以根据具体需求选择适合的方法。 ### 回答3: Oracle中可以使用以下方法来插入集合数据: 1. 使用INSERT INTO SELECT语句: 可以先创建一个包含集合数据的SELECT查询,然后通过INSERT INTO语句将查询结果插入到目标表中。例如: ```sql INSERT INTO target_table (column1, column2, column3) SELECT column1, column2, column3 FROM source_table WHERE condition; ``` 这里的source_table可以是一个包含集合数据的临时表或视图。 2. 使用BULK COLLECT INTO语句: 可以使用BULK COLLECT INTO语句将集合数据直接插入到一个PL/SQL记录集或表类变量中,然后再使用FORALL语句将记录集或表类变量的数据一次性插入到目标表中。例如: ```sql DECLARE TYPE target_table_type IS TABLE OF target_table%ROWTYPE; target_table_data target_table_type; BEGIN SELECT column1, column2, column3 BULK COLLECT INTO target_table_data FROM source_table WHERE condition; FORALL i IN 1..target_table_data.COUNT INSERT INTO target_table VALUES target_table_data(i); END; ``` 3. 使用INSERT ALL语句: 可以使用INSERT ALL语句一次性插入多条记录,其中每条记录来自于一个集合元素。例如: ```sql INSERT ALL INTO target_table (column1, column2, column3) VALUES (value1, value2, value3) INTO target_table (column1, column2, column3) VALUES (value4, value5, value6) ... SELECT * FROM DUAL; ``` 这里的value1, value2, value3等是集合中的元素值。 以上是部分以集合插入的方法,具体根据实际需求和数据结构来选择合适的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值