`

pl/sql集合类型

阅读更多
--集合类型
/*
  单行单列的数据,使用标量变量
  单行多列数据,使用记录
  单列多行数据,使用集合(。。。)
  *集合:类似于数组也就是。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;
分享到:
评论

相关推荐

    pl/sql最新中文手册

    6. **复合类型**:PL/SQL支持数组、集合和记录等复合类型,这些使得处理复杂数据结构变得可能。手册会详细介绍这些类型的创建和使用。 7. **包(Packages)**:包是将相关的过程、函数和变量封装在一起的一种方式,...

    PL/SQL语法帮助

    - **记录和集合**:用于存储多条数据,可以是自定义类型的记录或标准的PL/SQL集合类型。 - **包**:封装相关的过程、函数和变量,提供模块化的代码组织。 学习PL/SQL不仅有助于你更好地管理Oracle数据库,还能提升...

    oracle pl/sql从入门到精通 配套源代码

    此外,PL/SQL还支持集合类型,如VARRAY(可变数组)和TABLE(表类型),这对于处理大量数据非常有用。 这本书的配套源代码可能会涵盖以下几个方面: 1. **基础操作**:包括简单的SQL查询、变量声明、流程控制...

    ORACLE PL/SQL从入门到精通

    PL/SQL软件包是一组相关的过程和函数的集合,它可以用来组织和管理程序。软件包由两部分组成,说明部分和包体部分,分别用于声明公共接口和实现逻辑。 异常处理在PL/SQL中用来处理程序运行时发生的错误。PL/SQL预定...

    Oracle PL/SQL程序设计(第5版)(上下册)

    - **集合与记录**:学习如何使用PL/SQL中的集合和记录类型,这些结构可以帮助更高效地处理数据集。 - **游标**:介绍游标的使用方法,包括隐式游标和显式游标,以及如何利用游标遍历查询结果。 #### 四、PL/SQL中的...

    PL/SQL编程基础知识

    - **程序包**:集合了一系列相关的子程序、类型定义和其他PL/SQL元素,便于管理和复用。 **2.3 标识符规则** PL/SQL中的标识符遵循以下规则: - 标识符长度不能超过30个字符。 - 第一个字符必须是字母。 - 不区分...

    PL/SQL doc 文件

    * 包:是一组相关的 PL/SQL 程序块的集合。 * 触发器:是一种特殊的存储程序,用于自动执行某些操作。 定义函数的语法: CREATE [OR REPLACE] FUNCTION function_name [(argument [IN|OUT|IN OUT] datatype)] ...

    Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发

    2. **复合数据类型**:介绍PL/TABLE、记录类型(%ROWTYPE)以及集合类型(VARRAY和NESTED TABLE),这些都是处理大量数据或构建复杂数据结构的关键工具。 3. **游标**:讲解如何使用显式和隐式游标进行查询和遍历...

    Oracle Database 12c PL/SQL开发指南 实例源代码

    5. **集合类型**:包括数组(PLS_INTEGER索引的PL/SQL表)和关联数组(索引由非数字类型的值定义),以及如何在集合中插入、删除和迭代元素。 6. **包(PACKAGE)**:创建和使用包来组织相关的过程和函数,实现模块...

    PL/SQL安装包

    5. **数据操作**:除了标准的SQL查询,PL/SQL还支持集合操作,如BULK COLLECT和FORALL,可以高效地处理大量数据。 6. **游标**:PL/SQL中的游标允许逐行处理查询结果,是处理复杂数据操作的重要工具。 7. **记录...

    PL/SQL入门到精通书的源代码

    5. **过程与函数**:过程是一组PL/SQL语句的集合,用于执行特定任务。函数与过程类似,但返回一个值。它们可以提高代码的复用性和模块化。 6. **异常处理**:PL/SQL提供了一个强大的异常处理机制,允许你定义和捕获...

    精通pl/sql

    5. **集合类型**:讨论PL/SQL中的集合类型,如数组、关联数组、表类型和索引表,以及它们在处理大量数据时的优势。 6. **包(PACKAGE)**:解释如何创建和使用包,包括包规范(PACKAGE SPECIFICATION)和包体...

    pl/sql 学习资料

    - 表类型:使用PL/SQL表类型进行集合操作。 -记录类型:定义和使用记录类型,类似于结构或对象。 5. **程序单元**: - 包(PACKAGE):定义公共接口和私有实现,提高代码复用性。 -存储过程和函数:创建存储在...

    PL/SQL编程(电子版)

    2. 全面的数据类型支持:PL/SQL兼容所有SQL数据类型和Oracle对象类型。 3. 可存储与可重用:PL/SQL块可以被命名并存储在数据库中,便于重复使用,并可通过任何客户/服务器工具访问。 4. 安全性:可以通过Oracle数据...

    Oracle PL/SQL程序设计(第5版)(下册)第二部分

    《Oracle PL/SQL程序设计(第5版)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何有效地使用它。...

    oracle 中 pl/sql 只是学习方法

    3. **集合和游标**:集合是PL/SQL中处理多行数据的有效工具,如VARRAYs(固定大小数组)和associative arrays(关联数组)。游标则允许我们一行一行地处理查询结果,是处理动态数据的重要手段。 4. **存储过程和...

    PL/SQL development9.0.3

    2. **变量和数据类型**:PL/SQL支持多种内置数据类型,如NUMBER、VARCHAR2、DATE等,以及PL/SQL特有的记录和集合类型。 3. **流程控制语句**:包括IF-THEN-ELSIF-ELSE、CASE、FOR循环、WHILE循环等,用于控制程序的...

    Oracle 11g pl/sql编程

    7. SQL优化:解释PL/SQL代码的优化方法,例如编写高效的SQL语句、使用PL/SQL集合类型减少数据库I/O操作等。 8. 安全性:包括PL/SQL代码的安全性、如何在代码中处理敏感信息以及如何在Oracle数据库中管理PL/SQL代码的...

    PL/SQL学习笔记

    复合类型包括记录类型和集合类型,其中集合类型又包括数组和表。参考类型是记录的引用,用于在PL/SQL程序中操作数据库表中的行。 PL/SQL支持多种流程控制语句,包括条件语句(如IF和CASE)以及循环语句(如FOR、...

Global site tag (gtag.js) - Google Analytics