专栏首页杨建荣的学习笔记oracle中的数组(第一篇)(r4笔记第9天)

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; /

本文分享自微信公众号 - 杨建荣的学习笔记(jianrong-notes),作者:r4笔记第9天

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-01-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 根据SQL提炼表信息

    在MySQL慢日志通过pt工具解析后有一个小问题,那就是我们很难得到一个完整的table列表,即假设一条SQL语句很长,那么我们其实想知道这条SQL相关的表是哪...

    jeanron100
  • SQL Monitor,你值得掌握的一个特性(r10笔记第29天)

    对于线上的SQL语句,看着执行计划cost还不错,但是实际执行的时候效果却有千壤之别,这是为什么呢? 对于一个庞大的SQL语句,看着得到的执行计...

    jeanron100
  • 深入解析和定制Oracle优化工具

    首先不会Oracle的我觉得也可以听懂。哈哈,因为我不会专门讲oracle里的太细的东西。这部分的内容比较通用,可以借鉴思路。 我会在我的平台里面糅合这些思想,...

    jeanron100
  • JAVA实例化泛型

    DH镔
  • Json Schema 快速入门

    Json schema 本身遵循Json规范,本身就是一个Json字符串,先来看一个例子

    软测小生
  • dotnet检测类型是否为泛型

    private static string GetTableName(Type type) { //检测类型是否为泛型...

    hbbliyong
  • Go语言中反射的正确使用

    介绍 反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力。不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型。 反射有两个问题...

    李海彬
  • Go语言中反射的正确使用

    介绍 反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力。不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型。 反射有两个问题...

    李海彬
  • Go语言中反射的正确使用

    介绍 反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力。不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型。 反射有两个问题...

    李海彬
  • SILVA、GREENGENES、RDP三大数据库的序列探索统计

    最近对16s的三大数据库的序列的具体序列情况挺好奇的,决定统计一下各个序列的长度分布情况,以及这些序列具体分布在哪几个V区,有助于我解决后面16So数据的问题。...

    用户1075469

扫码关注云+社区

领取腾讯云代金券