oracle中的数组(第一篇)(r4笔记第9天)
数组在各种编程语言中都是很重要的数据结构实现,在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;
/
- 54. 心跳的实现 | 厚土Go学习笔记
- 53. Socket服务三次握手的示例 | 厚土Go学习笔记
- 使用Beego+Swagger构建更好的API服务
- ASM无法启动的问题分析(二)(r7笔记第88天)
- 43. 等价二叉树 | 厚土Go学习笔记
- 51. Socket服务端和客户端使用TCP协议通讯 | 厚土Go学习笔记
- 50. RESTful API的简单实现 | 厚土Go学习笔记
- go实现西瓜视频花椒直播等平台智能答题
- 主备切换的准备工作(二) (r7笔记第85天)
- 49. 访问PostgreSQL数据库增删改查 | 厚土Go学习笔记
- Golang中Interface类型详解
- Go语言的网络编程简介
- 一条关于swap争用的报警邮件分析(二)(r8笔记第4天)
- Golang泛型编程初体验
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- “dddb超级”工具包——高效、快速开发JavaWeb项目后端结构
- 在Java Web中设计的编解码
- 怎么让用一行代码实现页面的定时强制刷新?脚本刷流量再也不用愁了!
- 什么是Javac
- springBoot 入门(二)—— 使用 spring.profiles.active来区分配置
- Kubernetes 1.19.0——deployment(2)
- JavaWeb新手进阶经典项目 & 半小时高效开发 & 海量知识点涵盖 (二)
- Java web 开发 Session超时设置
- JavaWeb第四讲 会话跟踪技术HttpSession、Cookie、url、隐藏表单域
- springBoot 入门(三)—— 使用 RestController
- SSM第一讲 Spring概述和基础知识详解
- springBoot 入门(四)—— 使用 纯注解方式的junit整合测试
- ClassLoader工作机制
- SSM第三讲 SpringAOP开发
- 如何加载Class文件到JVM