`

oracle 集合类型

阅读更多
--集合类型
/*
  单行单列的数据,使用标量变量
  单行多列数据,使用记录
  单列多行数据,使用集合(。。。)
  *集合:类似于数组也就是。pl/sql集合类型包括索引表(pl/sql table)、嵌套表(Nested Table)、变长数组(VARRAY)等
*/
/*
    --集合方法
    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之间的所有元素
*/


--1 索引表
/*
@下标无限制,可以为负数
@元素个数无限制
定义
  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)
*/

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;
/*输出结果
hello-,
元素个数:2
元素个数:3
第一个元素-1
最后一个元素5
*/
--使用varchar2作为索引元素类型 ,其实也就和java中的map一样了 key-value形式存储
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;



--2嵌套表 NESTED TABLE
/*
下标从1开始,元素个数灭有限制(*使用时必须先初始化,用extend属性可以扩展元素个数)
可以作为表定义数据类型,但是前提是要先create 创造嵌套表类型,这就可以实现1对多了
定义
   TYPE type_name IS TABLE OF element_type;
   和索引表的区别也就是看看有无index by语句,嵌套表的索引固定是int型的
*/

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;

declare 
  type nest_tab_type is table of emp.ename%type;
  v_tab nest_tab_type;
begin 
  v_tab := nest_tab_type('x');
  select ename into v_tab(1) from emp where emp.empno=7788;
  dbms_output.put_line(v_tab(1));
end;

--在表列中使用嵌套表 嵌套表类型的列是单独一个表存储
  --先创建一个这样的类型 必须 才能使用
  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;



--3 VARRY 可变数组 变长数组 
/*
 定义
     TYPE type_name IS VARRAY(size_limit) OF element_type[NOT NULL];
     这个就和java中的数组差不多了,下标from 1 ,定义时先指定最大元素个数,也和varchar2(size)这种一样。
     使用时也必须先用构造方法初始化
     可以作为表列类型
*/
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;

--可变数组作为表列类型 可变数组是存储在表内部的,不同于嵌套表
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; 



--记录表 集合类型是表的一行,集合元素不仅可以是简单类型,也可以是复合类型
declare 
    type emp_tab_type is table of emp%rowtype index by binary_integer;
    v_tab emp_tab_type;
begin
    select * into v_tab(1) from emp where emp.empno=7788;
    dbms_output.put_line(v_tab(1).ename||'-'||v_tab(1).job||'-'||v_tab(1).sal);--SCOTT-ANALYST-3000
end;



--集合方法综合使用例子 主要是遍历集合

declare
    type v_table_type is table of varchar2(30);
    v_table v_table_type :=v_table_type();
begin
    dbms_output.put_line(v_table.count||'-'||v_table.limit||'-'||v_table.first||'-'||v_table.last); -- 0---
    if v_table.exists(1) then --判断index1是否有值
       null;
    else
       v_table.extend;--扩充一个值
       select ename into v_table(1) from emp where emp.empno=7788;
       dbms_output.put_line(v_table(1)); --SCOTT
       dbms_output.put_line(v_table.count||'-'||v_table.limit||'-'||v_table.first||'-'||v_table.last);-- 1--1-1
    end if;
end;

--遍历集合(不连续)
declare
    type v_tab_type is table of varchar2(30) index by binary_integer;
    v_tab v_tab_type;
    v_index int;
begin
    --添加几个无序有间隔的元素
    v_tab(-1) :='a';
    v_tab(2) :='b';
    v_tab(3) :='c';
    v_tab(5) :='d';
    v_tab(-2) :='e';
    --method 1
    v_index :=v_tab.first;
    for i in 1..v_tab.count loop
        dbms_output.put_line(v_tab(v_index));
        v_index :=v_tab.next(v_index);
    end loop;
    --method2
    for i in v_tab.first..v_tab.last loop
      if v_tab.exists(i) then
         dbms_output.put_line(v_tab(i));
      else
         dbms_output.put_line('元素不存在');
      end if;
    end loop;
end;

--修改集合中的元素
declare
    type v_tab_type is table of int;
    v_tab v_tab_type :=v_tab_type();
begin
    for i in 1..5 loop
     if v_tab.exists(i) then
        null;
     else 
       v_tab.extend;--扩展一个
       v_tab(i) := i*i;
     end if;
    end loop;
    dbms_output.put_line(v_tab.count);--5
    for i in 1..5 loop
        dbms_output.put_line(v_tab(i));
        if v_tab(i)=9 then --删除3*3=9的元素
           v_tab.delete(i);
        end if;
    end loop;
    dbms_output.put_line(v_tab.count);--4  
end;
1
1
分享到:
评论

相关推荐

    Oracle集合类型输出参数的PLSQL存储过程及其Java调用.docx

    ### Oracle集合类型输出参数的PL/SQL存储过程及其Java调用 #### 1. 引言 存储过程因其高效执行、事务处理能力以及安全性,在数据库应用程序中被广泛应用。特别是使用Oracle数据库时,PL/SQL(一种专为Oracle设计的...

    Oracle集合类型输出参数的PLSQL存储过程及其Java调用.doc

    Oracle集合类型输出参数的PL/SQL存储过程及Java调用主要涉及如何在Oracle数据库中使用存储过程处理集合数据,并在Java应用中调用这些过程。本文档介绍了一种使用索引表作为输出参数的方法,以及如何在Java中处理返回...

    Oracle三种集合数据类型的比较

    Oracle数据库系统提供了多种数据类型,其中包括了三种主要的集合数据类型:VARRAY(变量数组)、NESTED TABLE(嵌套表)和 Associative Array(关联数组,也称为INDEX BY TABLE)。这三种集合数据类型在存储和操作一...

    oracle sql集合

    ### Oracle SQL 集合知识点详解 #### 一、Oracle 安装完成后的初始口令 在Oracle数据库安装完成后,存在一系列预设的账号及其初始密码。这些账号对于数据库的安全性和管理至关重要。以下是一些常见账号及其初始口令...

    oci8源码,编译安装php连接oracle扩展

    6. **oci8_collection.c**:提供了对Oracle集合类型的支持,允许在PHP中操作Oracle的数组类型数据。 7. **CREDITS**:列出oci8扩展开发和贡献者的名单,体现了开源社区的协作精神。 8. **oci8.dsp**:可能是Visual...

    Oracle 10g 操作手册 Oracle数据类型精解

    7. **集合型**:VARRAY和NESTED TABLE是两种集合类型,用于存储数组或表格形式的数据。 二、Oracle 10g数据库管理员(DBA)操作 1. **数据库创建与管理**:DBCA(Database Configuration Assistant)用于图形化...

    Oracle的错误集合

    在Oracle数据库管理中,经常会遇到各种错误,本文主要讨论了三个...正确识别错误类型并采取相应的解决措施是关键。在日常运维中,定期备份、监控日志以及熟悉常见错误处理方法能够有效地减少故障发生并快速恢复服务。

    Oracle复合类型之RECORD

    Oracle复合类型之RECORD的深入浅出 Oracle复合类型之RECORD是Oracle数据库中的一种复杂数据类型,它允许用户定义一个包含多个字段的记录类型,类似于结构体或对象。 RECORD类型可以用于存储和处理复杂数据,使得...

    Oracle实用教程_04章_Oracle数据类型和函数[整理].pdf

    Oracle 数据类型是指一组性质相同的值的集合以及定义于这个值集合上的一组操作的总称。在 Oracle 数据库中,数据类型可以分为字符型、数值型、日期型和其它类型等几类。 Oracle 数据类型的使用和研究是早于计算机...

    Java调用oracle函数返回oracle类(类似)集合

    在Java中调用Oracle函数并处理返回的Oracle特定数据类型,如集合或索引表,通常涉及到Oracle的PL/SQL包和Java的JDBC驱动。以下是对这个主题的详细说明: 1. **Oracle索引表类型**: Oracle索引表是一种PL/SQL数据...

    v512工作室_张利国_Java高端培训系列教材_Oracle实用教程_04章_Oracle数据类型和函数.

    数据类型是由一组具有相同特性的值及其上定义的操作组成的一个集合。在现实世界中,为了有效地保存和处理不同类型的信息,我们需要使用不同的数据类型。例如,整型数据用于表示整数值,支持常见的数学运算如加、减、...

    ORCL数据库相关文档.rar_ORCL数据集合_Oracle命令集合_busy7dm_globewxf_oracle

    在"ORCL数据库相关文档.rar"这个压缩包中,我们可以找到一系列关于Oracle数据库的重要资料,尤其是"Oracle命令集合"部分,它涵盖了Oracle数据库管理和操作的各种常见命令。 首先,创建实例是Oracle数据库管理的基础...

    OracleHelper oracle数据库访问 多种方式 可靠 强大

    ADO.NET提供了基础的数据访问接口,而ODP.NET是Oracle官方提供的专用.NET数据提供者,它具有更优秀的性能和对Oracle特性的支持,例如高级的游标处理、LOB数据类型处理等。 OracleHelper 还可能包含对ORM(Object-...

    Oracle Exception汇总(自定义Oracle异常)

    Oracle数据库在处理错误和异常时有一套完整的机制,这些异常主要分为预定义异常和自定义异常。预定义异常是Oracle系统已经内置的一些常见错误,它们都有对应的错误代码(ORA-xxx)。下面,我们将深入探讨一些常见的...

    oracle常用函数和类型

    Oracle提供了许多其他功能,如数学函数、转换函数、日期和时间函数、集合函数、聚合函数等,使得数据库操作和查询变得极其灵活和强大。理解并熟练使用这些函数和数据类型是Oracle数据库管理的基础。

    plsql中的集合3剑客详解

    在PL/SQL中,Oracle提供了三种集合类型,它们分别是联合数组(Associative Array)、内嵌表(Nested Table)和索引表(Index-By Table),这些类型为处理和操作一维数据提供了强大的工具。让我们逐一深入理解这三种...

    Oracle数据类型详解

    8. **集合类型** - `VARRAY(n) OF dataType`: 可变数组,长度固定且有限,最多n个元素。 - `TABLE OF dataType INDEX BY indexType`: 动态大小的关联数组,可以用整数或字符串作为索引。 9. **对象类型** - ...

    ORACLE资料ORACLE资料

    这涉及到数据类型的选择、主键和外键的设定、索引的创建与优化、分区表的概念等。 5. **视图与存储过程**:视图可以简化复杂的查询,提供安全访问数据的层;存储过程是预编译的SQL语句集合,可提高执行效率,也可以...

    oracle(数据类型函数).

    里面有详细的oracle函数 1、Oracle数据类型 2、Oracle函数分为单行函数和多行函数两大类(sql_function) 单行函数分类 字符函数 数值函数 日期函数 转换函数 通用函数 函数嵌套 分组函数:集合操作符(了解) 实现...

Global site tag (gtag.js) - Google Analytics