zoukankan      html  css  js  c++  java
  • 初识oracle嵌套表

    oracle中的集合数据类型,允许存储元素集合,有三种变长数组、嵌套表、关联数组(索引表)。前段写查号程序看了下变长数组、索引表。
    嵌套表是嵌套在另一表中的表。可以插入、更新和删除嵌套表中的单个元素,可以存储任意个数目的元素。
    嵌套表是任意数量元素的有序集合,所有元素是同一数据类型。嵌套表有单个列,该列的类型可以是内置的数据库类型,也可以是以前创建过的对象类型。

    一、创建对象类型
    SQL> create type name_typ as object(
      2  first_name   varchar2(30),
      3  second_name  varchar2(30),
      4  short_name   varchar2(10)
      5  );
      6  /
     
    Type created

    二、创建嵌套表类型
    SQL> create type nested_table_name  as table of name_typ
      2  /
     
    Type created
    注:错误写法
    create table nested_table_name  as table of name_typ
     
    ORA-00928: missing SELECT keyword
    应该是tyep而非table,就像用关键字count decode定义变量,会报缺少(的错误一样。

    三、用嵌套表类型去定义表的列或者定义变量

    SQL> create table test_jhj(
      2  id number(6) primary key,
      3  names nested_table_name
      4  )
      5  nested table
      6     names
      7  store as
      8     nested_names
      9  /
     
    Table created

    注:
    create table test_jhj(
    id number(6),
    namees nested_table_name
    )
     
    ORA-22913: must specify table name for nested table column or attribute
    定义的时候,记得用nested table 标识,嵌套表列的的名称。意指实际嵌套表列名为nested_names。

    四、获得嵌套表相关的信息
    SQL> desc nested_table_name;
     nested_table_name TABLE OF NAME_TYP
     名称                                      是否为空? 类型
     ----------------------------------------- -------- ----------------------------
     FIRST_NAME                                         VARCHAR2(30)
     SECOND_NAME                                        VARCHAR2(30)
     SHORT_NAME                                         VARCHAR2(10)
    SQL> desc test_jhj;
     名称                                      是否为空? 类型
     ----------------------------------------- -------- ------------------------
     ID                                        NOT NULL NUMBER(6)
     NAMES                                              NESTED_TABLE_NAME

    SQL> set describe depth 2
    SQL> describe test_jhj
     名称                                      是否为空? 类型
     ----------------------------------------- -------- ------------------------
     ID                                        NOT NULL NUMBER(6)
     NAMES                                              NESTED_TABLE_NAME
       FIRST_NAME                                       VARCHAR2(30)
       SECOND_NAME                                      VARCHAR2(30)
       SHORT_NAME                                       VARCHAR2(10)

    SQL> select *
      2  from user_nested_tables/all_nested_tables
      3 
    五、嵌套表的操作:增、删、改、查;
    ①增
    表test_jhj可以看成1个家庭里 有多个成员 而每个成员有多个名字

    SQL> insert into test_jhj values(1,nested_table_name(name_typ('张','金花婆婆','婆婆'),
      2  name_typ('杨','00','杨帅帅')
      3  )
      4  );
    --------1号家庭有2名成员:小名分别为金花婆婆 杨帅帅



    SQL> insert into test_jhj values(2,
      2  nested_table_name(
      3    name_typ('曹','妙妙草','苗苗'),
      4    name_typ('徐','0','海豹'),
      5    name_typ('狄','狄狄兔','海洋一饼'),
      6    name_typ('于','00','小鱼')
      7    )
      8  );
    --------2号家庭有4名成员,昵称分别为苗苗 海豹 海洋一饼 小鱼

    ②查
    SQL> select *
      2  from test_jhj
         where id=1

     
            I
    ----------
    NAMES(FIRST_NAME, SECOND_NAME, SHORT_NAME)
    --------------------------------------------------------------------------------
             1
    NESTED_TABLE_NAME(NAME_TYP('张', '金花婆婆', '婆婆'), NAME_TYP('杨', '00', '杨
    帅帅'))


    ③改
    (1)随着时间的推移,1号家庭增加了一个nick为可可豆的成员

    SQL> insert into table(select names from test_jhj where id=1
      2  )values(name_typ('苏','小可','可可豆'));

    再看一下1号家庭的成员

    SQL> select *
      2  from test_jhj
      3  where id=1;

            ID
    ----------
    NAMES(FIRST_NAME, SECOND_NAME, SHORT_NAME)
    --------------------------------------------------------------------------------
             1
    NESTED_TABLE_NAME(NAME_TYP('张', '金花婆婆', '婆婆'), NAME_TYP('杨', '00', '杨
    帅帅'), NAME_TYP('苏', '小可', '可可豆'))


    (2)1号家庭nick为可可豆的同学 不叫苏小可 而叫莫小米
    SQL>  update table(select names from test_jhj where id=1) name_nick
      2   set 
      3    value(name_nick)=name_typ('莫','小米','可可豆')
      4   where
      5    value(name_nick)=name_typ('苏','小可','可可豆')
      6  /

    SQL> select *
      2  from test_jhj
      3  where id=1
      4  /

            ID
    ----------
    NAMES(FIRST_NAME, SECOND_NAME, SHORT_NAME)
    --------------------------------------------------------------------------------
             1
    NESTED_TABLE_NAME(NAME_TYP('张', '金花婆婆', '婆婆'), NAME_TYP('杨', '00', '杨
    帅帅'), NAME_TYP('莫', '小米', '可可豆'))

    (3)名叫莫小米,nick为可可豆的小童鞋,离家出走了,从花名册中delete
    SQL> delete
      2  from table
      3  (select names from test_jhj where id=1) name_nick
      4  where value(name_nick) = name_typ(
      5  '莫','小米','可可豆'
      6  );

    1号家庭还有几个人?
    SQL> select *
      2  from test_jhj
      3  where id=1
      4  /

            ID
    ----------
    NAMES(FIRST_NAME, SECOND_NAME, SHORT_NAME)
    --------------------------------------------------------------------------------
             1
    NESTED_TABLE_NAME(NAME_TYP('张', '金花婆婆', '婆婆'), NAME_TYP('杨', '00', '杨
    帅帅'))

    ----edit on 2010 06 30

  • 相关阅读:
    kafka集群搭建
    数据导入 xls --》mysql
    Spark --RDD算子
    Spark集群搭建
    【已解决】 IDEA运行spark程序报错:GC overhead limit exceeded?
    Spring Boot 配置 ---02
    Spring Boot 入门 ---01
    Nginx 推流 拉流 --- 点播直播
    【转】JS内置对象方法
    MapReduce 简单数据统计
  • 原文地址:https://www.cnblogs.com/gracejiang/p/5890461.html
Copyright © 2011-2022 走看看