所以我正在调试我的代码的一部分。我创建了名为array2D的数据类型。这是number_array的表,它是数字表。
create or replace type NUMBER_ARR is table of NUMBER;
create or replace TYPE ARRAY2D AS TABLE OF NUMBER_ARR;
我为调试编译了这两种类型,在这样做之后我能够看到表的每一行。但不是存储在其中的单个元素。元素的类型列为不透明。在为编译数据类型编译之前,我已经为整个表做了这个。
答案 0 :(得分:1)
create or replace type NUMBER_ARR is table of NUMBER;
/
create or replace TYPE ARRAY2D AS TABLE OF NUMBER_ARR;
/
create table t (id integer primary key, n array2d)
nested table n store as n_a(nested table column_value store as n_c);
insert into t values(1, array2d(number_arr(1,2), number_arr(3,4)));
insert into t values(2, array2d(number_arr(1,4)));
Select * from t
显示:
ID N
----------------------------
1 [unsupported data type]
2 [unsupported data type]
现在,要显示值,您必须将每个元素转换为表并按以下方式连接:
select t1.id, t3.column_value value
from t t1, table(t1.column_value) t2, table(t2.column_value) t3;
ID value
----------------
1 1
1 2
1 3
1 4
2 1
2 4
要显示每个ID的所有值,您可以使用listagg
select t1.id,
listagg(t3.column_value, ', ')
within group (order by t3.column_value) value
from t t1, table(t1.column_value) t2, table(t2.column_value) t3
group by t1.id;
ID value
----------------
1 1, 2, 3, 4
2 1, 4
当然,它将2d数组的所有元素显示为单个数字串。
根据您当前的类型定义,无法显示正确的显示(即每个数组在其自己的括号内,如((1,2,3,4),(4,5,6)))
。
这不起作用:
select id, '(' || listagg(value, ',')
within group (order by value) || ')' from
(select t1.id, t2.column_value c, '(' || listagg(t3.column_value, ',')
within group (order by t3.column_value) ||')' value
from t t1, table(t1.column_value) t2, table(t2.column_value) t3
group by t1.id, c)
group by id;
要像上面那样进行查询,您必须定义对象类型并定义map and order functions。
最后,我想说你应该坚持使用常规数据类型,因为它们更有效率。
<子> P.S。 - 如果没有唯一键,则必须使用rownum
或rowid
。