• PL/SQL学习笔记之集合


    一:PL/SQL集合

        集合是一个有序且存有相同的类型数据的数据结构。

        PL/SQL提供了三种集合类型:

    • 索引表(关联数组)

    • 嵌套表

    • 数组

    二:索引表:一个索引表(也叫关联数组)是一组键 - 值对。每个键是唯一的,并且用于定位对应的值。键可以是整数或字符串。【其实就是 Map类型】

         1)创建索引表

    TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY subscript_type; //定义索引表类型:指明值类型和键类型
    
    table_name type_name; //使用索引表类型定义索引表变量

        2)例子

    DECLARE
       TYPE salary IS TABLE OF NUMBER INDEX BY VARCHAR2(20); //定义索引表类型
       salary_list salary; //创建索引表
       name   VARCHAR2(20);
    BEGIN
       -- adding elements to the table
       salary_list('Rajnish')  := 62000; //为索引表add键值对
       salary_list('Minakshi')  := 75000;
       salary_list('Martin') := 100000;
       salary_list('James') := 78000;
    
       -- printing the table
       name := salary_list.FIRST;
       WHILE name IS NOT null LOOP
          dbms_output.put_line
          ('Salary of ' || name || ' is ' || TO_CHAR(salary_list(name))); //访问索引表元素
          name := salary_list.NEXT(name);
       END LOOP;
    END;

    三:嵌套表:大小可以动态的数组。【就是ArrayList】

        1)创建嵌套表

    TYPE type_name IS TABLE OF element_type [NOT NULL]; //声明嵌套表类型,指明元素的数据类型【不用指明大小!】
    
    table_name type_name; //创建嵌套表变量

        2)为嵌套表赋值

    table_name := type_name(val1,val2...);

        3)访问嵌套表元素

    table_name(i)

        4)例子

    DECLARE
       TYPE names_table IS TABLE OF VARCHAR2(10);
       TYPE grades IS TABLE OF INTEGER;
    
       names names_table;
       marks grades;
       total integer;
    BEGIN
       names := names_table('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz');
       marks:= grades(98, 97, 78, 87, 92);
       total := names.count;
       dbms_output.put_line('Total '|| total || ' Students');
       FOR i IN 1 .. total LOOP
          dbms_output.put_line('Student:'||names(i)||', Marks:' || marks(i));
       end loop;
    END;

    四:数组

    1:PL/SQL中,数组是VARRAY,其可存储相同类型元素的一个固定大小的连续集合。

    2:声明数组类型:指定最大长度,存储在VARRAY元素的类型。

    TYPE varray_type_name IS VARRAY(n) of <element_type>  #注意:这里不是创建数组,而是数组类型。即:声明一种类型,其  能存放n个  elementtype类型  的数据。

    3:使用数组类型创建变量

    array varray_type_name;

    4:为数组变量赋值

    array := varray_type_name(元素1,元素2,元素3...)

    5:获取数组元素

    array(i) #i是下标

    例如:

    DECLARE
       type namesarray IS VARRAY(5) OF VARCHAR2(10); #声明一种数组类型
       type grades IS VARRAY(5) OF INTEGER; #声明一种数组类型
       names namesarray; #创建数组变量
       marks grades; #创建数组变量
       total integer;
    BEGIN
       names := namesarray('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); #为数组赋值
       marks:= grades(98, 97, 78, 87, 92);#为数组赋值
       total := names.count;
       dbms_output.put_line('Total '|| total || ' Students');
       FOR i in 1 .. total LOOP
          dbms_output.put_line('Student: ' || names(i) || '
          Marks: ' || marks(i)); #获取数组元素
       END LOOP;
    END;

    五:集合方法

    S.N.方法名称及用途
    1 EXISTS(n)
    返回TRUE,如果一个集合中的第n个元素的存在;否则返回FALSE
    2 COUNT
    返回集合当前包含的元素数量
    3 LIMIT
    检查集合的最大尺寸
    4 FIRST
    返回在使用整数下标集合的第一个(最小的)索引号
    5 LAST
    返回在使用整数下标集合的最后一个(最大的)索引号
    6 PRIOR(n)
    返回集合中索引n前面的索引号
    7 NEXT(n)
    返回索引n的下一个索引号
    8 EXTEND
    追加1个空元素到集合
    9 EXTEND(n)
    追加n个空元素到集合
    10 EXTEND(n,i)
    追加的第i个元素的集合的n个拷贝
    11 TRIM
    移除集合的末尾一个元素
    12 TRIM(n)
    移除一个集合末尾的n个元素
    13 DELETE
    移除一个集合中的所有元素,设置计数为0
    14 DELETE(n)
    移除关联数组用数字键或嵌套表中的第n个元素。如果关联数组有一个字符串键,对应于该键的值的元素将被删除。如果n为空,DELETE(N)什么都不做
    15 DELETE(m,n)
    移除关联数组或嵌套表范围m..n所有元素。如果m大于n或如果m大于或n是零,DELETE(M,N)什么也不做

    六:集合异常

    COLLECTION_IS_NULL 尝试在一个原子空(null)的集合操作
    NO_DATA_FOUND 下标指定被删除的元素,或关联数组的一个不存在的元素
    SUBSCRIPT_BEYOND_COUNT 下标超过了一个集合的元素数
    SUBSCRIPT_OUTSIDE_LIMIT 下标超出了允许的范围
    VALUE_ERROR 下标为空(null)或不可转换的键类型。如果该键被定义为PLS_INTEGER范围,下标是在该范围之外可能会出现这样的异常
  • 相关阅读:
    UIWebView 本地缓存
    基于x86 Android ndk应用移植指南(android ndk 生成libs/x86)
    安装android的IntelHaxm.exe时出错的问题
    使用javah生成.h文件, 出现无法访问android.app,Activity的错误的解决
    犯傻似得的开发
    关于在win8下开发c或者c++时,某些特殊情况
    android 图片加载过多崩溃
    辞职的三十八个理由
    android程序的代码混淆打包
    几条常见的数据库建表id增长sql语句
  • 原文地址:https://www.cnblogs.com/ygj0930/p/8298210.html
Copyright © 2020-2023  润新知