You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Oracle中创建二维Varray?支持字符串、整数或混合类型

在Oracle中创建二维VARRAY的方法

Oracle中的VARRAY是固定大小的有序集合,要实现二维VARRAY,本质是定义元素为VARRAY类型的VARRAY。下面分三种场景给出具体实现:

1. 整数类型的二维VARRAY

先定义一维整数数组类型,再基于它创建二维数组类型:

-- 定义一维整数VARRAY类型(最多包含10个整数元素)
CREATE OR REPLACE TYPE INT_ARRAY AS VARRAY(10) OF INTEGER;
/

-- 定义二维整数VARRAY类型(元素为INT_ARRAY,最多包含5个一维数组)
CREATE OR REPLACE TYPE INT_2D_ARRAY AS VARRAY(5) OF INT_ARRAY;
/

使用示例(PL/SQL)

DECLARE
  v_2d_int INT_2D_ARRAY;
BEGIN
  -- 初始化二维数组:包含3个一维数组,每个一维数组有2个整数
  v_2d_int := INT_2D_ARRAY(
    INT_ARRAY(1, 2),
    INT_ARRAY(3, 4),
    INT_ARRAY(5, 6)
  );
  
  -- 遍历输出数据
  FOR i IN 1..v_2d_int.COUNT LOOP
    FOR j IN 1..v_2d_int(i).COUNT LOOP
      DBMS_OUTPUT.PUT_LINE('第' || i || '行,第' || j || '列:' || v_2d_int(i)(j));
    END LOOP;
  END LOOP;
END;
/

2. 字符串类型的二维VARRAY

逻辑和整数类型一致,仅替换元素类型为字符串:

-- 定义一维字符串VARRAY类型(每个元素最多50字符,最多10个元素)
CREATE OR REPLACE TYPE VARCHAR2_ARRAY AS VARRAY(10) OF VARCHAR2(50);
/

-- 定义二维字符串VARRAY类型(最多包含5个一维数组)
CREATE OR REPLACE TYPE VARCHAR2_2D_ARRAY AS VARRAY(5) OF VARCHAR2_ARRAY;
/

使用示例(存储到表中)

-- 创建包含二维VARRAY字段的表
CREATE TABLE str_2d_table (
  id NUMBER PRIMARY KEY,
  str_data VARCHAR2_2D_ARRAY
);

-- 插入数据
INSERT INTO str_2d_table VALUES (
  1,
  VARCHAR2_2D_ARRAY(
    VARCHAR2_ARRAY('张三', '李四'),
    VARCHAR2_ARRAY('王五', '赵六')
  )
);

-- 查询并展开数据
SELECT 
  id,
  t.COLUMN_VALUE(1) AS col1,
  t.COLUMN_VALUE(2) AS col2
FROM str_2d_table, TABLE(str_data) t;

3. 混合数据类型的二维VARRAY

VARRAY的元素类型必须统一,因此需要先定义包含整数和字符串的对象类型,再基于对象类型创建二维VARRAY:

-- 定义混合数据对象类型
CREATE OR REPLACE TYPE MIXED_TYPE AS OBJECT (
  num_val INTEGER,
  str_val VARCHAR2(50)
);
/

-- 定义一维混合数据VARRAY类型
CREATE OR REPLACE TYPE MIXED_ARRAY AS VARRAY(10) OF MIXED_TYPE;
/

-- 定义二维混合数据VARRAY类型
CREATE OR REPLACE TYPE MIXED_2D_ARRAY AS VARRAY(5) OF MIXED_ARRAY;
/

使用示例

DECLARE
  v_2d_mixed MIXED_2D_ARRAY;
BEGIN
  v_2d_mixed := MIXED_2D_ARRAY(
    MIXED_ARRAY(
      MIXED_TYPE(1, '苹果'),
      MIXED_TYPE(2, '香蕉')
    ),
    MIXED_ARRAY(
      MIXED_TYPE(3, '橙子'),
      MIXED_TYPE(4, '葡萄')
    )
  );
  
  -- 输出混合数据
  FOR i IN 1..v_2d_mixed.COUNT LOOP
    FOR j IN 1..v_2d_mixed(i).COUNT LOOP
      DBMS_OUTPUT.PUT_LINE('第' || i || '行,第' || j || '列:数字=' || v_2d_mixed(i)(j).num_val || ',字符串=' || v_2d_mixed(i)(j).str_val);
    END LOOP;
  END LOOP;
END;
/

注意:VARRAY的大小是固定的,定义时指定的长度(比如VARRAY(10))是最大元素数,实际使用时可以少于这个数;如果需要动态扩展大小,建议改用嵌套表(Nested Table)。

内容的提问来源于stack exchange,提问作者Suyog Mate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 03:40:41