Skip to content

数组类型(VARRAY)

类型介绍

数组类型是在SQL标准1999中增加的,表示有序的相同数据类型元素的集合。数据库中使用VARRY OF关键字可以创建或声明数组类型,数组内的每个元素均有一个索引下标,代表元素在数组中的位置,且可以根据下标直接访问数组元素。

VARRAY可变数组类型是一个连续的相同数据类型元素的集合,成员最多包含65535个,成员类型可以是基础类型也可以是用户自定义类型。

语法格式

创建VARRAY类型:

sql
CREATE OR REPLACE TYPE udt_name IS VARRAY(size) OF type_x;

参数说明

  • type_name:定义的类型名称。
  • size:VARRAY数组的指定容量,创建时必须指定。
  • type_x:元素的数据类型,可以是基本数据类型(如 NUMBER、VARCHAR2等)或其他用户自定义类型。

示例

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

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

    sql
    CREATE OR REPLACE TYPE udt_varryofobj_type IS VARRAY(10) OF udt_obj_type;
  2. 创建表。创建了一个表varry_tab,其中包含一个列 udt_varryofobj,其数据类型为udt_varryofobj_type。

    sql
    CREATE TABLE varry_tab(id INT, state VARCHAR2, type VARCHAR, udt_varryofobj UDT_VARRYOFOBJ_TYPE);
  3. 插入数据。

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

    • 可以查询表中的udt_varryofobj列,查看整个UDT对象。
      sql
      SELECT id, udt_varryofobj FROM varry_tab;
      
      ID | UDT_VARRYOFOBJ |
      ------------------------------------------------------------------------------
      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_varryofobj_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_varryofobj(1) ,udt_varryofobj(2) FROM varry_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]|