如何在Oracle中实现PostgreSQL array column数组列的等效功能?
Oracle实现数组类型表列的方案
首先纠正认知:你提到的「VARRAY仅能在PL/SQL中使用、无法用于建表」的说法是错误的,VARRAY完全支持作为表列类型在标准SQL场景使用。
步骤1:提前定义VARRAY数组类型
Oracle不支持PostgreSQL那种直接在字段定义时声明类型[]的写法,需要先显式创建自定义数组类型:
-- 定义一个最多可存储100个VARCHAR2(100)元素的数组类型,类型名可自定义 CREATE OR REPLACE TYPE varchar_arr AS VARRAY(100) OF VARCHAR2(100); /
步骤2:创建带数组列的表
直接使用上面定义的数组类型作为字段类型即可:
CREATE TABLE test( arrcolumn varchar_arr );
步骤3:插入数组数据
插入时使用数组类型的构造函数传入元素值,和PostgreSQL的'{a,b}'写法效果完全一致:
INSERT INTO test(arrcolumn) VALUES (varchar_arr('bla', 'blubber'));
常用查询验证写法
- 查询完整数组内容:
SELECT arrcolumn FROM test;
- 将数组元素展开为多行展示:
SELECT t.column_value AS element FROM test, TABLE(test.arrcolumn) t;
补充:可选方案嵌套表(Nested Table)
如果你的数组没有固定的长度上限,也可以选择嵌套表类型,定义和使用方式和VARRAY几乎一致,仅类型声明时略有不同:
-- 定义无长度上限的嵌套表类型 CREATE OR REPLACE TYPE varchar_nested_tab AS TABLE OF VARCHAR2(100); /
建表时需要额外指定STORE AS参数声明嵌套表的存储名:
CREATE TABLE test( arrcolumn varchar_nested_tab ) NESTED TABLE arrcolumn STORE AS arrcolumn_nested;
插入、查询的写法和VARRAY完全通用。
内容的提问来源于stack exchange,提问作者Hasan Tuncay
相关产品推荐
相关产品推荐

