PL/SQL 基础—复杂数据类型和自定义类型
PLSQL中常用的自定义类型就两种: 记录类型、 PLSQL内存表类型(根据表中的数据字段的简单和复杂程度又可分别实现类似于简单数组和记录数组的功能)
除此之外,还有大对象类型:CLOB、BFILE
一. 内存表对象(集合)
常用函数
函数名 | 功能 |
---|---|
COUNT | 返回集合中元素的个数 |
DELETE | 删除集合中所有元素 |
DELETE(x) | 删除元素下标为x的元素 对VARRAY非法 |
DELETE(x,y) | 删除元素下标从X到Y的元素 对VARRAY非法 |
EXTEND | 在集合末尾添加一个元素 对Index_by非法 |
EXTEND(x) | 在集合末尾添加x个元素 对Index_by非法 |
EXTEND(x,n) | 在集合末尾添加元素n的x个副本 对Index_by非法 |
EXIST(x) | 如果集合元素x已经初始化,则返回TRUE, 否则返回FALSE |
FIRST | 返回集合中的第一个元素的下标号,对于VARRAY集合始终返回1 |
LAST | 返回集合中最后一个元素的下标号, 对于VARRAY返回值始终等于COUNT |
LIMIT | 返回VARRY集合的最大的元素个数 Index_by集合和嵌套表无用 |
NEXT(x) | 返回在第x个元素之后及紧挨着它的元素值,如果x是最后一个元素,返回null |
PRIOR(x) | 返回在第x个元素之前紧挨着它的元素的值,如果x是第一个元素,则返回null |
TRIM | 从集合末端开始删除一个元素 对于index_by不合法 |
TRIM(x) | 从集合末端开始删除x个元素 |
1 .变长数组(VARRAY) – 简单数组、下标自动生成(int)、不可从中间删除
-- 变长数组
TYPE type_name IS VARRAY (max_elements)
OF element_datatype [ NOT NULL ];
DECLARE
TYPE t_array IS VARRAY(5) OF NUMBER;
m_data t_array;
BEGIN
m_data := t_array(0,1,2,3,4);
FOR i IN 1..5 LOOP
DBMS_OUTPUT.put_line(m_data(i));
END LOOP;
END;
注:
1 .VARRAY变量需要初始化存储空间
1. m_data := t_array(0,1,2,3,4); 2. m_date.EXTEND(x[,n]);
2 .下标从1开始:1..N
3 .大小不能超过类型定义的大小: TYPE t_array IS VARRAY(5) OF NUMBER
2 .索引表(Associative arrays) – 索引类型自定义(和值一一对应),可删除,下表不变
数组值和唯一的索引关联,和变长数组有下标不同
TYPE type_name IS TABLE OF element_datatype [ NOT NULL ]
--->
INDEX BY BINARY_INTEGER;
INDEX BY PLS_INTEGER;
INDEX BY POSITIVE;
INDEX BY NATURAL;
INDEX BY SIGNTYPE;
INDEX BY VARCHAR2(32767);
INDEX BY table.column%TYPE;
INDEX BY cursor.column%TYPE;
INDEX BY package.variable%TYPE;
INDEX BY package.subtype;
-- 索引表
DECLARE
TYPE t_associative_table IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
v_table t_associative_table;
BEGIN
-- 不能使用 v_table := t_associative_table(0,1,2,2,4);
v_table(1) := 1;
v_table(2) := 2;
v_table(3) := 3;
v_table(4) := 3;
v_table(5) := 5;
FOR i IN 1..5 LOOP
IF v_table.EXISTS(i) THEN
v_table.DELETE(i);