sql developer中的数据类型是不透明的

时间:2016-12-27 13:03:51

标签: sql oracle plsql oracle-sqldeveloper

所以我正在调试我的代码的一部分。我创建了名为array2D的数据类型。这是number_array的表,它是数字表。

create or replace type NUMBER_ARR is table of NUMBER;
create or replace TYPE ARRAY2D AS TABLE OF NUMBER_ARR;

我为调试编译了这两种类型,在这样做之后我能够看到表的每一行。但不是存储在其中的单个元素。元素的类型列为不透明。在为编译数据类型编译之前,我已经为整个表做了这个。

1 个答案:

答案 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。 - 如果没有唯一键,则必须使用rownumrowid