如何在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
相关产品推荐
相关产品推荐

