PLSQL集合

PLSQL集合

  • 索引表(或者叫做关联数组,associative array )
  • 嵌套表(nested table)
  • 变长数组(varray)
  • 二维数组(多层集合)

索引表

---创建索引表类型的语法如下所示:

TYPE  type_name IS TABLE OF  element_type

INDEX BY index_type;

table_name  TYPE_NAME;

--其中,element_type 指明集合中存放的数据的类型

--index_type指定下标的类型。只能是整型或者字符串

--使用下标来引用索引表中的单个元素,如下所示:

table_name(index);

---示例1:分别声明一个游标和一个索引表类型,游标

--从student表中检索出前10个学生的姓名。遍历游标,

--将每个学生的姓名保存到一个索引表类型的集合中,

--然后从集合中取出每个学生的姓名打印到屏幕上

declare
  --声明游标,保存10个学生姓名
 cursor c_student is
   select last_name
     from student
     where rownum <= 10; 
  --声明索引表集合类型
 type last_name_type is table of student.last_name%type
   index by pls_integer;   
  --声明集合变量
 last_name_tab last_name_type;
  --声明下标变量
 v_index pls_integer := 0;
begin
  --遍历游标
  forr_student in c_student loop
   v_index := v_index + 1;
   --将学生姓名保存到集合中
   last_name_tab(v_index) := r_student.last_name; 
  endloop;
  --遍历集合
  fori in 1..10 loop
   dbms_output.put_line( last_name_tab(i));
  endloop;
  --注意:引用不存在的集合元素会抛出NO_DATA_FOUND异常。
  --例如
 --dbms_output.put_line(last_name_tab(11));
end;

嵌套表

创建嵌套表的语法如下所示:

TYPE type_name IS TABLEOF element_type;

table_name  TYPE_NAME;

--该声明非常类似于索引表的声明,只是没有INDEXBY子句。

--嵌套表的下标类型固定为Integer整型

declare
  --声明游标,保存10个学生姓名
 cursor c_student is
   select last_name
     from student
     where rownum <= 10;   
  --声明嵌套表集合类型
 type last_name_type is table of student.last_name%type;
  --声明集合变量。必须使用构造器函数进行初始化
  last_name_tab last_name_type := last_name_type();
  --声明下标变量
  v_indexpls_integer := 0;
begin
  --遍历游标
  forr_student in c_student loop
   v_index := v_index + 1;
   --必须调用extend方法添加存储空间
    last_name_tab.extend;         --和数组一样,每赋值一个元素需调用extend
   --将学生姓名保存到集合中
   last_name_tab(v_index) := r_student.last_name; 
  endloop;
  --遍历集合
  fori in 1..10 loop
   dbms_output.put_line( last_name_tab(i));
  endloop; 
end;

变长数组

创建变长数组的语法如下所示:

TYPE  type_name IS VARRAY(size_limit) OFelement_type ;

varray_name  TYPE_NAME;

--size_limit:最大元素个数

--它和嵌套表类型的区别是:他有最大元素个数限制

--修改上例,使用保长数组类型

declare
  --声明游标,保存10个学生姓名
 cursor c_student is
   select last_name
     from student
     where rownum <= 10;
  --声明变长数组集合类型
  type last_name_type is varray(10) of student.last_name%type; 
  --声明集合变量。必须使用构造器函数进行初始化
  last_name_tab last_name_type := last_name_type();
  --声明下标变量
 v_index pls_integer := 0;
begin
  --遍历游标
  forr_student in c_student loop
   v_index := v_index + 1;
   --必须调用extend方法添加存储空间
    last_name_tab.extend;   --每赋值一个元素需调用extend
   --将学生姓名保存到集合中
   last_name_tab(v_index) := r_student.last_name; 
  endloop;
  --遍历集合
  fori in 1..10 loop
   dbms_output.put_line( last_name_tab(i));
  endloop; 
end;

--可见,变长数组在编码使用的限制和嵌套表完全相同。

二维数组

Oracle 9i开始,PL/SQL允许创建元素类型为集合类型的集合。这种集合被称为多层集合。

二维数组:有一个一维数组,其中的每个元素又是一个一维数组,那么这个一维数组叫做二维数组。

为引用这个多层集合中单独的元素,需要使用如下语法:

varray_name(subscript  of the outer  varray)

(subscript  of the  inner varray)

declare
  --声明变长数组类型
  typevarray_type1 is varray(4) of number;
  --声明多层集合(二维数组)
  typevarray_type2 is varray(3) of varray_type1;
  varray1varray_type1 := varray_type1(2,4,6,8);
  varray2varray_type2 := varray_type2(varray1);
begin
 varray2.extend;  --调用extend
  varray2(2):= varray_type1(1,3,5,7);
 varray2.extend;  --调用extend
  varray2(3):= varray_type1(8,8,8,8); 
  --遍历集合
  for i in1..3 loop
    for j in1..4 loop
      dbms_output.put_line(‘varray2(‘||i||‘)(‘||j
      ||‘)=‘||varray2(i)(j));
    end loop;
  end loop;
 dbms_output.put_line(‘-------------------------------‘);
 
  --遍历集合,实际的写法
  for i invarray2.first..varray2.last loop
    for j invarray2(i).first..varray2(i).last loop
     dbms_output.put_line(‘varray2(‘||i||‘)(‘||j
      ||‘)=‘||varray2(i)(j));
    end loop;
  end loop;
end;
/
时间: 2024-10-12 20:02:00

PLSQL集合的相关文章

PLSQL集合笔记

针对多行单列的数据处理,用之前的标量变量肯定不行,这里引入一个新的数据类型复合数据类型. 这个复合类型类似于语言的数组struct[i],包括索引表,嵌套表,边长数组三种类型, 一.索引表称为PLSQL的表,下标与数组比较可以为负数,下标个数没有限制,这个只能用在数据类型,不能定义完之后用在表中承当列类型,不需要初始化. TYPE type_name IS TABLE OF element_type [not null] index by key_type; identifier type_na

PLSQL==&gt;集合

联合数组 创建联合数组的语法如下所示(方括号中的保留字和短句是可选的) TYPE type_name is table of element_type(not null) index by element_type; type_name TYPE_NAME; 注意,需要两个步骤声明联合数组.首先,使用TYPE语句声明表结构,其中type_name是在第2步骤中所使用的类型的名称,用于声明一个实际的表.element_type是plsql数据类型,如number,varchar2或者date,也可

PL/SQL 游标详解

刚打开游标的时候,是位于一个空行,要用fetch into 才能到第一行.只是要注意用更新游标的时候,不能在游标期间commit. 否则会报ORA-01002: fetch out of sequence就是COMMIT导致的错误.在打开有for update的cursor时,系统会给取出的数据加上排他锁(exclusive), 这样在这个锁释放前其他用户不能对这些记录作update.delete和加锁.而我一旦执行了commit,锁就释放了,游标也变成无效的,再去fetch数据时就出现错误了.

PLSQL变量和类型,流程控制语句,集合

1 ---PLSQL 调试授权 2 GRANT debug any procedure, debug connect session TO scott; 3 --定义变量 4 declare 5 part_number number(6); --SQL类型 6 part_name varchar2(20); --SQL类型 7 in_stock boolean; --plsql类型 8 part_price pls_integer; --plsql类型 9 part_description va

oracle中PLSQL存储过程中如何使用逗号分隔的集合(逗号分隔字符串转换为一个集合)

原文: https://blogs.oracle.com/aramamoo/entry/how_to_split_comma_separated_string_and_pass_to_in_clause_of_select_statement 'SMITH,ALLEN,WARD,JONES'  为4个值的集合,在存储过程中需要怎么处理才能实现 in (值1,值2,值3,值4 ) 的效果: 下面的方法值得借鉴:下面的方式将一个逗号表达式变成一列的4行的集合来实现. select regexp_su

plsql函数返回数组集合例子

1 create or replace type t_test as object( 2 id integer, 3 rq date, 4 mc varchar2(60) 5 ); 6 7 create or replace type t_test_table as table of t_test; 8 9 create or replace function f_test_array(n in number default null) return t_test_table 10 as 11

plsql的环境与介绍:环境的搭建和plsql的简单介绍

PLSQL编程 1.环境的搭建 (1)创建一个存储表空间 SQL> conn /as sysdbaConnected. SQL> create tablespace plsql datafile '/u01/oracle/oradata/ORCL/plsql01.dbf' size 1G; Tablespace created. (2)创建PLSQL用户SQL> create user plsql identified by plsql default tablespace plsql;

plsql动态绑定

13. 批绑定 13.1 本地批绑定 问题产生的原因:由于SQL引擎和PLSQL引擎来回切换而造成的上下切换而引发性能开销 批绑定:在SQL语句中为PLSQL变量赋值,而一次性将整个集合绑定,不是通过游标循环的方式,从而减少数据往返的次数.           用了批绑定之后,在SQL引擎和PLSQL引擎之间的上下文切换次数会减少,提高系统的性能 案例: declare  type region_rec is record(region_id number(4),region_name varc

PL-SQL编程基础(4) 异常处理

异常处理: 即使良好的PL-SQL程序也会遇到错误或者未预料的事件,一个优秀的程序都应该能够处理各种出错情况,尽可能的从错误中恢复.程序在运行时出现的错误成为异常.发生异常后,语句讲终止执行,PLSQL会立即将控制权交给PLSQL异常处理部分.Oracle中使用EXCEPTION来处理异常,一般有3种异常错误. 有三种类型的异常错误: 1. 预定义 ( Predefined )错误 ORACLE预定义的异常情况大约有24个.对这种异常情况的处理,无需在程序中定义,由ORACLE自动将其引发. 2