oracle中的数组(第一篇)

数组在各种编程语言中都是很重要的数据结构实现,在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;
  /

时间: 2024-09-24 02:43:42

oracle中的数组(第一篇)的相关文章

Oracle数据库学习之第一篇

  权限管理: oracle 9里面默认的三个用户名和密码: sys change_on_install //权限最高的管理员 system manager //普通的管理员 scott tiger //普通用户 在oracle 10中,仍然使用这三个用户作为默认用户.但sys和system用户的密码不再默认.在安装数据库的时候,可以由用户指定 .从安全角度考虑,scott用户默认被锁定,所以要使用该用户,需要先解除锁定. 注意:我们要使用oracle数据库,至少要启动两个服务,一个是监听服务,

在oracle实践学习位运算 第一篇

今天无意中看到了谭浩强先生的>这本书,虽然c语言都是很多年前学过的东西了,但是看起来亲切,实际用起来陌生,很多的概念都已经很模糊了,记得上大学时老师特别推荐的位运算这一部分,自己这次又看了下,还是有一定的收获. 位运算非常的简洁,使用起来看起来很高深,很有专业的味道,经常在一些笔试面试题中出现一些位运算的身影.而且个人觉得位运算确实是比较通用和精华的内容. 位运算是二进制位的运算,c语言提供了位运算的功能,在其它的高级语言(java)中也有实现,还是具有一定的优势的. c语言中提供的位运算符有

《Oracle高性能SQL引擎剖析:SQL优化与调优机制详解》一第一篇 执行计划

第一篇 执行计划 执行计划是指示Oracle如何获取和过滤数据.产生最终结果集,是影响SQL语句执行性能的关键因素.我们在深入了解执行计划之前,首先需要知道执行计划是在什么时候产生的,以及如何让SQL引擎为语句生成执行计划. 在深入了解执行计划之前,我们先了解SQL语句的处理执行过程.当一条语句提交到Oracle后,SQL引擎会分为三个步骤对其处理和执行:解析(Parse).执行(Execute)和获取(Fetch),分别由SQL引擎的不同组件完成.SQL引擎的组件如图1-1所示. 1. SQL

探索ORACLE不完全恢复之--基于cancel恢复 第一篇

探索ORACLE不完全恢复之--基于cancel恢复 第一篇 作者:吴伟龙   Name:Prodence Woo QQ:286507175  msn:hapy-wuweilong@hotmail.com 基于cancel的不一致性恢复(归档存在) 第一篇                 基于取消的恢复只适用于以下情况:归档日志丢失导致完全恢复失败:丢失了数据文件和未归档的重做日志(联机重做日志):   1.先关闭数据库,执行一次全库冷备份.   SQL> selectfile_name fro

《C语言解惑》—— 第一篇 C语言编程中的对与错

第一篇 C语言编程中的对与错 本篇主要采用分析编程中存在的典型错误.对比正确与错误程序的方法,使读者加深印象并提高分辨语法对错及编程的能力,进而达到尽快掌握C语言编程基础知识的目的.

探索ORACLE不完全恢复之--基于SCN恢复 第一篇

探索ORACLE不完全恢复之--基于时间恢复 作者:吴伟龙   Name:Prodence Woo QQ:286507175  msn:hapy-wuweilong@hotmail.com 基于SCN恢复 第一篇 1.在删除数据之前,察看下SCN号是多少: SQL> col name format a45 SQL> set line 300 SQL> select name,checkpoint_change# from v$datafile_header;   NAME        

MySQL中的online DDL(第一篇)(r11笔记第3天)

记得有一天快下班的时候,一位开发同事找到我说,需要对一个表做变更,数据量据说有上千万,而当时是使用的MySQL版本是5.5,这可如何是好,对于在线业务要求高的情况下,这种需求真是让人头疼. 而在早期的版本中,这种问题就更让人无语了.在Oracle中这个问题解决的较早,当然在很多技术实现细节上,Oracle和MySQL还是蛮大的差距.Oracle中有在线重定义的方案物化视图prebuilt和在线重定义 (r10笔记第25天),而且本身对于一些DDL的操作代价要比MySQL低.不过在碰到添加字段且加

操作系统存储管理和oracle数据库(第一篇)

在上大学的时候,学习操作系统感觉特别枯燥,都是些条条框框的知识点,感觉和实际的关联不大.发现越是工作以后,在工作中越想深入了解,发现操作系统越发的重要.像现在的RHCE市场反响不错,如果想深入地学习,就有很多操作系统的知识需要补补.在实践中结合理论还是不错的一种学习方法.自从接触数据库以后,越来越感觉到很多东西其实都是相通的,操作系统中的很多设计思想在数据库中也有借鉴和改进之处.所谓大道至简,其实就是这个道理.  说到存储管理,是操作系统中式最重要的资源之一.因为任何程序和数据等都需要占有一定的

php中删除数组的第一个元素和最后一个元素的函数_php技巧

对于一个php数组,该如何删除该数组的第一个元素或者最后一个元素呢?其实这两个过程都可以通过php自带的函数 array_pop 和 array_shift 来完成,下面就具体介绍一下如何来操作. (1)使用 array_pop 删除数组的最后一个元素,例如: $user=array('apple','banana','orange'); $result=array_pop($user); print_r($result); print_r($user); 结果将是: orange array(