ITPub博客

首页 > 数据库 > Oracle > oracle中的数组(第一篇)

oracle中的数组(第一篇)

Oracle 作者:dbhelper 时间:2015-01-17 22:54:23 0 删除 编辑
数组在各种编程语言中都是很重要的数据结构实现,在oracle中也有自己的一席之地。自己简单做了几个实验,发现很多东西还是眼高手低,真实去做的时候,里面还是有不少的细节的。
首先数组大体可以有以下几种。
固定长度的数组
变长数组
多维数组
如果说实现方式,就有varray,嵌套表,record等等。我们从varray来开始。
比如实现一个固定长度的数组。长度为10

SQL> create type varray_type as varray(10) of number(10);
  2  /
Type created.
如果观察足够仔细,就会发现,创建type已经以;结尾了,但是还是需要等到/出现才会创建type.
我们来一个等价的方式。
SQL> drop type varray_type;
Type dropped.

SQL> create type varray_type is varray(10) of number(10)
  2  /
Type created.

我们可以改变数组的数据类型,但是也是以扩展为前提。比如我们收缩数据类型。
SQL> alter type varray_type modify element type number(9);
alter type varray_type modify element type number(9)
*
ERROR at line 1:
ORA-22324: altered type has compilation errors
ORA-22328: object "N1"."VARRAY_TYPE" has errors.
PLS-00729: only widening of the collection element type is allowed
ORA-06550: line 0, column 0:
PL/SQL: Compilation unit analysis terminated

但是如果扩展,就没有问题。
SQL> alter type varray_type modify element type number(11) cascade;
Type altered.
我们也可以修改数据的长度。
alter type varray_type modify limit 200 cascade;

如果需要对varray初始化,语法和cursor还是很相似的。
比如我们直接调用刚创建的varray,初始化数据,然后输出。
set serveroutput on
declare
v_type varray_type;
begin
v_type:=varray_type(5,2,4);
for i in v_type.first()..v_type.last() loop
dbms_output.put_line(v_type.limit);
dbms_output.put_line(v_type(i));
dbms_output.put_line(v_type.count());
end loop;
end;
/

其中for i in v_type.first()..v_type.last() loop  等价于 for i in 1..v_type.count() loop
输出的结果如下:
10
5
10
2
10
4

固定长度的数组相对比较简单,来看看不定长的数组,可以使用下面的形式来实现。
如果格式和定长数组类似,可以这样写。
DECLARE
  TYPE new_type IS TABLE OF VARCHAR2(10) ;
  v_tab new_type:=new_type('a','b','c');
  BEGIN
      
  FOR i IN 1..v_tab.count LOOP
  dbms_output.put_line(v_tab(i));
  END LOOP;
  END;
  /
输出为:
a
b
c

一般比较灵活的方式是使用index by的方式。
DECLARE
  TYPE new_type IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;
  v_tab new_type ;
  BEGIN
      v_tab(1):='a';
      v_tab(2):='b';
      v_tab(3):='c';
  FOR i IN 1..v_tab.count LOOP
  dbms_output.put_line(v_tab(i));
  END LOOP;
  END;
  /
输出结果如下:
a
b
c

如果你没有index by 的部分,那么就会抛出下面的错误,这个时候需要使用v_tab.extend来一行一行的挪动了。
SQL> DECLARE
  2    TYPE new_type IS TABLE OF VARCHAR2(10) ;
  3    v_tab type_tab;
  4    BEGIN
  5        v_tab(1):='a';
  6        v_tab(2):='b';
  7        v_tab(3):='c';
  8    FOR i IN 1..v_tab.count LOOP
  9    dbms_output.put_line(v_tab(i));
 10    END LOOP;
 11    END;
 12    /
DECLARE
*
ERROR at line 1:
ORA-06531: Reference to uninitialized collection
ORA-06512: at line 5

需要添加啊extend的字句,一行一行的挪。
DECLARE
  TYPE new_type IS TABLE OF VARCHAR2(10) ;
  v_tab new_type:=new_type();
  BEGIN
      v_tab.extend;
      v_tab(1):='a';
      v_tab.extend;
      v_tab(2):='b';
      v_tab.extend;
      v_tab(3):='c';
  FOR i IN 1..v_tab.count LOOP
  dbms_output.put_line(v_tab(i));
  END LOOP;
  END;
  /






来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/8494287/viewspace-1405504/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2017-10-14

  • 博文量
    651
  • 访问量
    392190