25.PLSQL中的数组

        在上一文<<24.PLSQL中的索引表>>中,我们介绍了oracle中的索引表的使用,之前提到过索引表类似C语言中的数组,本文介绍一种PLSQL中真正的数组---Varray。Varray具有以下特点:

        1、Varray是固定长度的数组,在创建时需要制定数组的长度和类型。

        2、Varray可以放置重复的元素。

        3、Varray是一种可以在PLSQL外进行编译的类型,它的声明周期和作用域都是全局的,可被当做用户自定义的一种数据类型使用。如下,我们创建了一个名叫projects_varray的数组后,用sql developer可以看到这个数据类型,我们可以像使用普通的类型如,number、varchar2一样使用它:


一、创建数组

        创建数组的语法如下:
create or replace type 数组名称 is varray of 数组元素类型
        如下面的例子,我们创建了一个名叫projects_varray的数组,数组中元素的类型为varchar2(20)。
 create or replace type projects_varray is varray(10) of varchar2(20); 

二、创建使用数组作为字段的数据表

        一旦创建好数组之后,我们可以像使用普通的数据类型一样的使用数组,如下,我创建了一个叫做mydept的数据表,它的第三个字段就是用的projects_varray数组,表示每个部门完成的项目列表。
create table mydept(deptnum number,dname varchar2(20),projects projects_varray);

三、向含有数组的数据表中插入数据

        通过以下的方式向含有数组的数据表插入数据:
insert into mydept values (1,'系统软件部',projects_varray('NGP','Pecstart'));
        使用select语句查看我们刚才查入的数据,发现结果如下:
        数组一旦创建成功,其使用方法其实已经和普通的数据类型没有两样了,比如我们还可以和普通类型一样修改数据表的字段:
update mydept set projects=projects_varray('GNP','Pecstar','IEMS') where deptnum=1;
        再次查询修改后的数据,得到的结果如下:


四、在PLSQL中使用数组

        以上的代码都是在plsql语句块之外执行的,我们也可以把数组的定义放到PLSQL里面,如下面的代码,在declare块定义了一个数组projects_varray2:

declare
  type projects_varray2 is varray(10) of varchar2(20); 
begin
  null;
end;
/
       我们先留意下在declare里面创建的数组和在外面创建数组的语法有什么不同?答案就是在declare里面没有create or replace 关键字,这也就限定了创建的数据类型的作用域和声明周期只能在这个语句块之内,这也就是之前我们介绍过的记录类型record、索引表类型table的只能在创建它的plsql语句内使用的原因。

        创建好数组之后,我们也可以像使用索引表一样对数组进行遍历:

declare
  type projects_varray2 is varray(4) of varchar2(20); 
  v_projects projects_varray2:=projects_varray2('NGP','Pecstar','IEMS',NULL);
begin
  v_projects(4):='IEEM';
  for x in v_projects.first .. v_projects.last loop
      dbms_output.put_line(v_projects(x));
  end loop;
end;
/
        结果如下:





  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
br>精通Oracle 10g PL/SQL编程 <br><br><br>【作 者】王海亮 林立新 于三禄 郑建茹 <br>【丛 书 名】 万水Oracle技术丛书 <br><br>http://images.china-pub.com/ebook20001-25000/21975/shupi.jpg<br><br>PL/SQL是Oracle特有的编程语言,它不仅具有过程编程语言的基本特征(循环、条件分支等),而且还具有对象编程语言的高级特征(重载、继承等)。 本书是专门为Oracle应用开发人员提供的编程指南。通过学习本书,读者不仅可以掌握PL/SQL的基础编程知识(嵌入SQL语句和编写子程序),而且还可以掌握PL/SQL的所有高级开发特征(使用记录类型、集合类型、对象类型和大对象类型)。另外,本书还为应用开发人员提供了大量Oracle9i和Oracle 10g新增加的PL/SQL特征。 本书不仅适合于PL/SQL初学者,而且也适合于有经验的PL/SQL编程人员,本书还可以作为Oracle培训班的教材或者辅助材料。 <br><br><br>前言<br>第1章 PL/SQL综述<br>1.1 SQL简介<br>1.2 PL/SQL简介<br>1.3 Oracle 10g PL/SQL新特征<br>第2章 PL/SQL开发工具<br>2.1 SQL*Plus<br>2.2 PL/SQL Developer<br>2.3 Procedure Builder<br>2.4 习题<br>第3章 PUSQL基础<br>3.1 PL/SQL块简介<br>3.1.1 PL/SQL块结构<br>3.1.2 PL/SQL块分类<br>3.2 定义并使用变量<br>3.2.1 标量变量<br>3.2.2 复合变量<br>3.2.3 参照变量<br>3.2.4 LOB变量<br>3.2.5 非PL/SQL变量<br>3.3 编写PL/SQL代码<br>3.3.1 PL/SQL词汇单元<br>3.3.2 PL/SQL代码编写规则<br>3.4 习题<br>第4章 使用SQL语句<br>4.1 使用基本查询<br>4.1.1 简单查询语句<br>4.1.2 使用WHERE子句<br>4.1.3 使用ORDERBY子句<br>4.2 使用DML语句<br>4.2.1 插入数据<br>4.2.2 更新数据<br>4.2.3 删除数据<br>4.3 使用事务控制语句<br>4.3.1 事务和锁<br>4.3.2 提交事务<br>4.3.3 回退事务<br>4.3.4 只读事务<br>4.3.5 顺序事务<br>4.4 数据分组<br>4.4.1 分组函数<br>4.4.2 GROUPBY和HAVING<br>4.4.3 ROLLUP和CUBE<br>4.4.4 GROUPINGSETS<br>4.5 连接查询<br>4.5.1 相等连接<br>4.5.2 不等连接<br>4.5.3 自连接<br>4.5.4 内连接和外连接<br>4.6 子查询<br>4.6.1 单行子查询<br>4.6.2 多行子查询<br>4.6.3 多列子查询<br>4.6.4 其他子查询<br>4.7 合并查询<br>4.8 其他复杂查询<br>4.9 习题<br>第5章 SQL函数<br>5.1 数字函数<br>5.2 字符函数<br>5.3 日期时间函数<br>5.4 转换函数<br>5.5 集合函数<br>5.6 其他单行函数<br>5.7 分组函数<br>5.8 对象函数<br>5.9 习题第<br>6章 访问Oracle<br>6.1 检索单行数据<br>6.2 操纵数据<br>6.2.1 插入数据<br>6.2.2 更新数据<br>6.2.3 删除数据<br>6.2.4 SQL游标<br>6.3 事务控制语句<br>6.4 习题<br>第7章 编写控制结构<br>7.1 条件分支语句<br>7.2 CASE语句<br>7.3 循环语句<br>7.4 顺序控制语句<br>7.5 习题<br>第8章 使用复合数据类型<br>8.1 PL/SQL记录<br>8.1.1 定义PL/SQL记录<br>8.1.2 使用PL/SQL记录<br>8.2 PL/SQL集合<br>8.2.1 索引表<br>8.2.2 嵌套表<br>8.2.3 变长数组(VARRAY)<br>8.2.4 PL/SQL记录表<br>8.2.5 多级集合<br>8.2.6 集合方法<br>8.2.7 集合赋值<br>8.2.8 比较集合<br>8.3 批量绑定<br>8.3.1 FORALL语句<br>8.3.2 BULKCOLLECT子句<br>8.4 习题<br>第9章 使用游标<br>9.1 显式游标<br>9.2 参数游标<br>9.3 使用游标更新或删除数据<br>9.4 游标FOR循环<br>9.5 使用游标变量<br>9.6 使用CURSOR表达式<br>9.7 习题<br>第10章 处理例外<br>10.1 例外简介<br>10.2 处理预定义例外<br>10.3 处理非预定义例外<br>10.4 处理自定义例外<br>10.5 使用例外函数<br>10.6 PL/SQL编译警告<br>10.7 习题<br>第11章 开发子程序<br>11.1 开发过程<br>11.2 开发函数<br>11.3 管理子程序<br>11.4 习题<br>第12章 开发包<br>12.1 建立包<br>12.2 使用包重载<br>12.3 使用包构造过程<br>12.4 使用纯度级别<br>12.5 习题<br>第13章 开发触发器<br>13.1 触发器简介<br>13.2 建立DML触发器<br>13.2.1 语句触发器<br>13.2.2 行触发器<br>13.2.3 使用DML触发器<br>13.3 建立INSTEADOF触发器<br>13.4 建立系统事件触发器<br>13.5 管理触发器<br>13.6 习题<br>第14章 开发动态SQL<br>14. 1 动态SQL简介<br>14.2 处理非查询语句<br>14.3 处理多行查询语句<br>14.4 在动态SQL使用BULK子句<br>14.5 习题第15章 使用对象类型<br>15.1 对象类型简介<br>15.2 建立和使用简单对象类型<br>15.3 建立和使用复杂对象类型<br>15.3.1 对象类型嵌套<br>15.3.2 参照对象类型<br>15.3.3 对象类型继承<br>15.4 维护对象类型<br>15.5 习题<br>第16章 使用LOB对象<br>16.1 LOB简介<br>16.2 DBMS LOB包<br>16.3 访问LOB<br>16.3.1 访问CLOB<br>16.3.2 访问BLOB<br>16.3.3 访问BFILE<br>16.4 习题<br>第17章 使用Oracle系统包<br>17.1 DBMS_OUTPUT<br>17.2 DBMS JOB<br>17.3 DBMS PIPE<br>17.4 DBMSAIERT<br>17.5 DBMS TRANSACTION<br>17.6 DBMS SESSION<br>17.7 DBMS ROWID<br>17.8 DBMSRLS<br>17.9 DBMS DDL<br>17.10 DBMS SHARED POOL<br>17.11 DBMSRANDOM<br>17.12 DBMS LOGMNR<br>17.13 DBMS FLASHBACK<br>17.14 DBMS OBFUSCATION TOOLKIT<br>17.15 DBMS SPACE<br>17.16 DBMS SPACE ADMIN<br>17.17 DBMSTTS<br>17.18 DBMSREPAIR<br>17.19 DBMSRESOURCE MANAGER<br>17.20 DBMS STATS<br>17.21 UTL FIIE<br>17.22 UTL INADDR<br>附录A 习题参考答案<br>附录B 使用SQL*Plus <br><br>http://www.china-pub.com/21975
在PL/SQL数组被称为集合(collection),可以使用索引来访问集合的元素。以下是访问集合元素的示例代码: ```sql DECLARE -- 声明一个集合变量 TYPE num_list IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; my_list num_list; BEGIN -- 初始化集合 my_list(1) := 10; my_list(2) := 20; my_list(3) := 30; -- 访问集合元素 DBMS_OUTPUT.PUT_LINE('Element 1: ' || my_list(1)); DBMS_OUTPUT.PUT_LINE('Element 2: ' || my_list(2)); DBMS_OUTPUT.PUT_LINE('Element 3: ' || my_list(3)); END; ``` 在这个例子,我们首先声明了一个名为 `num_list` 的集合类型,它包含 `NUMBER` 类型的元素。然后我们声明了一个名为 `my_list` 的变量,它是一个 `num_list` 类型的集合。我们初始化这个集合的前三个元素,并使用索引来访问集合的元素。 请注意,在 PL/SQL ,集合的索引从 1 开始而不是从 0 开始,这与大多数编程语言不同。 如果你希望在 PL/SQL 遍历一个集合的所有元素,可以使用 `FORALL` 循环或 `LOOP` 循环。以下是一个使用 `FORALL` 循环遍历集合的示例代码: ```sql DECLARE -- 声明一个集合变量 TYPE num_list IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; my_list num_list; BEGIN -- 初始化集合 my_list(1) := 10; my_list(2) := 20; my_list(3) := 30; -- 遍历集合元素 FORALL i IN my_list.FIRST .. my_list.LAST DBMS_OUTPUT.PUT_LINE('Element ' || i || ': ' || my_list(i)); END; ``` 在这个例子,我们使用 `FORALL` 循环遍历了整个集合,并打印出了每个元素的值。请注意,`my_list.FIRST` 和 `my_list.LAST` 分别返回集合第一个和最后一个元素的索引。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值