DECLARE TYPE num_array IS VARRAY(5) OF NUMBER; nums num_array := num_array(10, 20, 30); BEGIN FOR i IN1..nums.COUNT LOOP DBMS_OUTPUT.PUT_LINE('Value: '|| nums(i)); END LOOP; END;
PostgreSQL (PL/pgSQL) —— 推荐方式
DO $$ DECLARE nums INTEGER[] :=ARRAY[10, 20, 30]; -- 自动推断为 integer[] i INT; BEGIN FOR i IN1..array_length(nums, 1) LOOP RAISE NOTICE 'Value: %', nums[i]; END LOOP; END $$;
DO $$ DECLARE nums limited_int_array :=ARRAY[10, 20, 30]; BEGIN RAISE NOTICE 'Array: %', nums; END $$;
案例 2:Nested Table(嵌套表) → PG 数组 或 UNNEST
oracle
DECLARE TYPE emp_list ISTABLEOF VARCHAR2(100); employees emp_list := emp_list('Alice', 'Bob', 'Charlie'); BEGIN FOR i IN employees.FIRST..employees.LAST LOOP DBMS_OUTPUT.PUT_LINE(employees(i)); END LOOP; END;
PostgreSQL 方式 1:直接用数组
DO $$ DECLARE employees TEXT[] :=ARRAY['Alice', 'Bob', 'Charlie']; i INT; BEGIN FOR i IN1..array_length(employees, 1) LOOP ... RAISE NOTICE '%', employees[i]; END LOOP; END $$;
PostgreSQL 方式 2:将数组展开为行(类似 TABLE() 函数)
-- 模拟 Oracle: SELECT * FROM TABLE(employees) SELECTunnest(ARRAY['Alice', 'Bob', 'Charlie']) AS name;
输出:
name -------- Alice Bob Charlie
优势:UNNEST()可直接在 SQL 中使用,无需 PL/pgSQL
三、高级场景:数组作为表列存储
Oracle(Nested Table 列)
CREATE TYPE tag_list ASTABLEOF VARCHAR2(50); CREATE TABLE articles ( id NUMBER, title VARCHAR2(100), tags tag_list ) NESTED TABLE tags STORE AS tags_table;
PostgreSQL 等效
-- 直接使用数组类型 CREATE TABLE articles ( id SERIAL, title TEXT, tags TEXT[] -- 数组列 );