Skip to content

嵌套表类型(TABLE)

类型介绍

嵌套表类型(SQL中称为多重集合类型)是在SQL2003中增加的,表示无序的相同类型数组元素的集合。数据库中使用TABLE OF关键字可以创建或声明嵌套表类型,嵌套表内的每个元素均有一个索引下标,代表元素在数组中的位置,且可以根据下标直接访问嵌套表元素。不同数组的是,嵌套表未经删减,元素数据位置是连续的,若删除中间位置的数据后,数据变成了离散的。

一般而言,E-R模式中的多值属性可以映射到SQL中的以多重集合为值的属性,若顺序是重要的,则使用SQL数组来代替多重集合。

语法格式

创建TABLE类型:

sql
CREATE OR REPLACE TYPE udt_name AS TABLE OF type_x;

查询表中TABLE数据:

sql
-- 查询table整体
SELECT c_1, udt_col FROM obj_tab;
SELECT udt_name(...) FROM dual;

-- 查询table的部分属性
SELECT udt_name(i) FROM udt_tab;

参数说明

  • udt_name:定义的类型名称。
  • type_x:元素的数据类型,可以是基本数据类型(如 NUMBER、VARCHAR2等)或其他用户自定义类型。
  • c_1:普通列。
  • udt_col:嵌套表列,定义的用户定义类型udt_name的实例。
  • i:嵌套表中的某列。

示例

创建用户定义类型(UDT),使用这些类型创建表,并进行插入和查询操作。

  1. 创建VARRAY类型,定义了一个对象类型udt_obj_type和一个可变数组类型udt_ttabofobj_type。

    sql
    CREATE OR REPLACE TYPE udt_ttabofobj_type AS TABLE OF udt_obj_type;
  2. 创建表。创建了一个表ttab_tab,其中包含一个列 udt_ttabofobj,其数据类型为udt_ttabofobj_type。

    sql
    CREATE TABLE ttab_tab(id INT,
    state VARCHAR2,
    type VARCHAR,
    udt_ttabofobj udt_ttabofobj_type);
  3. 插入数据。

    • 使用构造函数插入数据。可以直接使用构造函数在INSERT语句中插入数据。
      sql
      --字段类型
      INSERT INTO ttab_tab (id, state, type, udt_ttabofobj) 
      VALUES (
        2, 
        '构造函数插入', 
        'udt_ttabofobj_type',
        udt_ttabofobj_type(
          udt_obj_type(1.0, '2层', 'udt_obj_type', '2021-08-24 00:00:00'),
          udt_obj_type(1.0, '2层', 'udt_obj_type', '2021-08-24 00:00:00')
        )
      );
    • 使用变量插入数据。在PL/SQL块中声明一个变量,然后将该变量插入到表中。
      sql
      -- 变量类型
      DECLARE
      	udt_ttabofobj udt_ttabofobj_type;
      BEGIN
      	udt_ttabofobj := udt_ttabofobj_type(
        	udt_obj_type(1.0, '2层', 'udt_obj_type', '2021-08-24 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),
          udt_obj_type(1.0, '2层', 'udt_obj_type', '2021-08-24 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
        );
        INSERT INTO varry_tab (id, state, type, udt_ttabofobj)
        VALUES (2, 'plsql通过udt变量插入数据', 'udt_ttabofobj_type', udt_ttabofobj);
      END;
      /
  4. 查询数据。利用table()方法把table类型的数据当成表值调用,把它当成表查询包含的成员值。

    • 可以查询表中的udt_varryofobj列,查看整个UDT对象。
      sql
      SELECT id, udt_varryofobj FROM ttab_tab;
      
      ID | UDT_TTABOFOBJ |
      ------------------------------------------------------------------------------
      2 | [[1,2层,udt_obj_type,2021-08-24 00:00:00],[1,2层,udt_obj_type,2021-08-24 00:00:00]]|
      2 | [[1,2层,udt_obj_type,2021-08-24 00:00:00],[1,2层,udt_obj_type,2021-08-24 00:00:00]]|
    • 直接在SQL语句中创建UDT对象并查看其内容。
      sql
      SELECT udt_ttabofobj_type(
      udt_obj_type(
      1.0,'2层','udt_obj_type','2021-08-24 00:00:00') ,
      udt_obj_type(
      1.0,'2层','udt_obj_type','2021-08-24 00:00:00') )
      FROM DUAL;
      
      EXPR1 |
      ------------------------------------------------------------------------------
      [[1,2层,udt_obj_type,2021-08-24 00:00:00],[1,2层,udt_obj_type,2021-08-24 00:00:00]]|
    • 查询UDT的部分属性。
      sql
      SELECT udt_ttabofobj(1),udt_ttabofobj(2) FROM ttab_tab;
      
      EXPR1 | EXPR2 |
      ------------------------------------------------------------------------------
      [1,2层,udt_obj_type,2021-08-24 00:00:00]| [1,2层,udt_obj_type,2021-08-24 00:00:00]|
      [1,2层,udt_obj_type,2021-08-24 00:00:00]| [1,2层,udt_obj_type,2021-08-24 00:00:00]|