Oracle中的数组分为固定数组和可变数组。

一、固定数组
固定数组:在定义的时候预定义了数组的大小,在初始化数组时如果超出这个大小,会提示ORA-06532:超出小标超出限制!
语法:
        TYPE arry_var IS VARRAY(2) OF VARCHAR2(10);--定义了一个存放2个char类型的数组
例:


DECLARE

-- declare fixed array
     TYPE arry_var IS VARRAY(2) OF VARCHAR2(10);
     arry_name arry_var;
BEGIN
     -- init array
    arry_name := arry_var('tom', 'jim','tim'); --注:此处初始化了三个值,会报错
    dbms_output.put_line(arry_name(1));
    dbms_output.put_line(arry_name(2));
END;


二、可变数组
可变数组:在数组中可以有任意数量的元素,元素的类型要预先定义,数组的下标可以设置为自增.
1、一维数组
1)下标为自增长,table 表示可变长度,index by bybinary_integer子句代表以符号整数为索引
语法:
      TYPE t_table IS TABLE OF VARCHAR2(30) INDEX BYBINARY_INTEGER;
例:


DECLARE
       TYPE t_table IS TABLE OF VARCHAR2(30) INDEX BYBINARY_INTEGER;
       v_table t_table;
       v_cnt NUMBER;
BEGIN
       v_table(1) := '1';
       v_table(2) := '3';
       v_table(3) := '9';

v_cnt := v_table.COUNT;
      FOR i IN 1 .. v_cnt LOOP
           dbms_output.put_line(v_table(i));
      END LOOP;
END;

输出为:1 3 9 ,此处的1 3 9是以字符型存放在数组中
注:Oracle中的数组下标是从1开始的,下标必须是连续的。


2、多维数组
多维数组:可以看作是嵌套表,视为表中之表,可以有任意数量的元素,不需要预先定义限制值。
1).Create Table


create table XXUSER
(
       USER_ID NUMBER,
  USER_NAME VARCHAR2(255),
  SEX VARCHAR2(2),
  AGE NUMBER(3),
  ADDRESS VARCHAR2(2000)
)


2).定义结果集(Record),存放xxuser中的部分字段


DECLARE
      -- only 2 fileds
      TYPE t_record_user IS RECORD(
          user_id xxuser.user_id%type,
          user_name xxuser.user_name%type
       );--此处只用到了xxuser表中的两个字段
      TYPE t_user IS TABLE OF t_record_user INDEX BY BINARY_INTEGER;
       v_arry_user t_user;
BEGIN
       SELECT user_id, user_name BULK COLLECT INTO v_arry_user FROM xxuser; --BULK COLLECT表示将批量查询数据直接插入collection中,而不是通过cursur一条条插入;在现在的程序中大部分实现是通过游标插入的。
       FOR i IN 1 .. v_arry_user.COUNT LOOP
              dbms_output.put_line(v_arry_user(i).user_name); --多维数组的调用方式
       END LOOP;
END;


3).使用ROWTYPE,存放xxuser的全部字段,比Record简洁。


DECLARE
        -- ALL,XXUser(user_id, user_name, sex, age, address)
        TYPE t_user IS TABLE OF xxuser%ROWTYPE INDEX BY BINARY_INTEGER;
        v_arry_user t_user;
BEGIN
        SELECT * BULK COLLECT INTO v_arry_user FROM xxuser;
        FOR i IN 1 .. v_arry_user.COUNT LOOP
              dbms_output.put_line(v_arry_user(i).user_name || v_arry_user(i).sex);
        END LOOP;
END;


/*
1.COUNT 返回集合中元素的个数
2.DELETE 删除集合中所有元素
3.DELETE(x) 删除元素下标为x的元素 对VARRAY非法
4.DELETE(x,y) 删除元素下标从X到Y的元素 对VARRAY非法
5.EXIST(x) 如果集合元素x已经初始化,则返回TRUE, 否则返回FALSE
6.EXTEND 在集合末尾添加一个元素 对Index_by非法
7.EXTEND(x) 在集合末尾添加x个元素 对Index_by非法
8.EXTEND(x,n) 在集合末尾添加元素n的x个副本 对Index_by非法
9.FIRST 返回集合中的第一个元素的下标号,对于VARRAY集合始终返回1。
10.LAST 返回集合中最后一个元素的下标号, 对于VARRAY返回值始终等于COUNT.
11.LIMIT 返回VARRY集合的最大的元素个数 Index_by集合和嵌套表无用
12.NEXT(x) 返回在第x个元素之后及紧挨着它的元素值,如果x是最后一个元素,返回null.
13.PRIOR(x) 返回在第x个元素之前紧挨着它的元素的值,如果x是第一个元素,则返回null。
14.TRIM 从集合末端开始删除一个元素 对于index_by不合法
15.TRIM(x) 从集合末端开始删除x个元素
var_array.next(3); //返回var_array(3)
*/

转自:https://www.cnblogs.com/chenchengfei/p/9133385.htmlhttps://www.cnblogs.com/kubimiantiao/p/3795778.html

oracle中的数组的更多相关文章

  1. 向Oracle中传入数组,批量执行SQL语句

    1.首先用PL/SQL创建package create or replace package excuteBatchOperate as type sqlStr_Array ) index by bi ...

  2. Java SpringMvc+hibernate架构中,调用Oracle中的sp,传递数组参数

    一.问题 我们调用数据,大都是可以直接获取表中的数据,或者用复杂点的sql语句组成的.但是,有时候,当这样达不到我们要的全部数据的时候,这时,我们就用到了存储过程[sp],如果sp需要参数是数组的话, ...

  3. oracle中imp命令详解 .

    转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...

  4. 慕课网-安卓工程师初养成-6-3 如何使用 Java 中的数组

    来源:http://www.imooc.com/code/1525 Java 中操作数组只需要四个步骤: 1. 声明数组 语法:  或者  其中,数组名可以是任意合法的变量名,如: 2. 分配空间 简 ...

  5. oracle中imp命令具体解释

    oracle中imp命令具体解释 Oracle的导入有用程序(Import utility)同意从数据库提取数据,而且将数据写入操作系统文件.imp使用的基本格式:imp[username[/pass ...

  6. oracle中110个常用函数介绍

    1. ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dua ...

  7. 创建类似于Oracle中decode的函数

    -- 创建类似于Oracle中decode的函数create or replace function decode(variadic p_decode_list text[])returns text ...

  8. oracle中动态SQL详解

    部分内容参考网上资料 1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情 ...

  9. Oracle中的AWR,全称为Automatic Workload Repository

    Oracle中的AWR,全称为Automatic Workload Repository,自动负载信息库.它收集关于特定数据库的操作统计信息和其他统计信息,Oracle以固定的时间间隔(默认为1个小时 ...

随机推荐

  1. IELTS6 2020.7 Translation

    原文 <三国演义>(The Romance of the ThreeKingdoms)是中国一部著名的历史小说,写于十四世纪.这部文学作品以三国时期的历史为背景,描写了从公元二世纪下半叶到 ...

  2. 腾讯云星星海SA2云服务器特点

    一.腾讯云星星海SA2云服务器特点 腾讯云深度定制AMD处理器.AMD EPYC ROME ,频率3.3Ghz.提供超大单核 L3 Cache.(基础频率2.6Ghz,睿频3.3Ghz).企业级服务器 ...

  3. K8S在线部署含Dashborad

    参考文章 https://www.kubernetes.org.cn/5462.html 前言 Kubernetes作为容器编排工具,简化容器管理,提升工作效率而颇受青睐.很多新手部署Kubernet ...

  4. Linux&C open creat read write lseek 函数用法总结

    一:五个函数的参数以及返回值. 函数                                 参数                      返回值     open (文件名,打开方式以及读 ...

  5. ansible主机组配置及秘钥分发

    ansible主机组配置及秘钥分发 ansible主机组文件位于/etc/ansible/hosts文件中 1 hosts主机经常使用到的变量为: 2 ansible_ssh_host #用于指定被管 ...

  6. 为何我中断执行的线程不起作用,Why

    摘要:我们就以一个案例的形式,来为大家详细介绍下为何中断执行的线程不起作用. 本文分享自华为云社区<明明中断了线程,却为何不起作用呢?>,作者:冰 河. 当我们在调用Java对象的wait ...

  7. 开源项目|Go 开发的一款分布式唯一 ID 生成系统

    原文连接: 开源项目|Go 开发的一款分布式唯一 ID 生成系统 今天跟大家介绍一个开源项目:id-maker,主要功能是用来在分布式环境下生成唯一 ID.上周停更了一周,也是用来开发和测试这个项目的 ...

  8. 设计模式学习-使用go实现装饰模式

    装饰器模式 定义 代码实现 优点 缺点 适用范围 装饰器模式和桥接模式的区别 参考 装饰器模式 定义 装饰模式:动态的给一些对象添加额外的职责,就增加功能来说,装饰模式比生成子类更灵活. 举个栗子: ...

  9. 什么是齐博x1标签

    X系列的标签跟V系列的标签区别还是很大的.在V系列的时候,只有一种很简单的标签比如$label[XXXX]以前的标签相对现在的来说太简单的点,所以在功能上也比较受限.X系列目前有几下几种标签 {qb: ...

  10. 来了!公开揭密团队成员开发鸿蒙 OpenHarmony 的完整过程(收获官方7000奖金和开发板等,1w字用心总结)

    背景 随着 OpenHarmony 组件开发大赛结果公布,我们的团队成员被告知获得了二等奖,在开心之余也想将我们这段时间宝贵的开发经验写下来与大家分享,当我们看到参赛通知的时候已经是 9 月中旬的时候 ...