我在我的查询中使用COLLECT
函数,它正在创建内部系统生成的类型,即使它是对已存在的SQL类型集合的CAST
这样的事情:
cast(collect(opentrades_id)as t_dds_number)
现在它正在创建一个内部创建的类型,如SYSTPZrEBTIYRDGYUI==
此外,用户正在向PUBLIC授予执行权。
我想了解为什么要创建系统生成的类型并为PUBLIC提供执行权限?
答案 0 :(得分:1)
这就是它的工作方式。
为了投射 TO ,我们必须投射 FROM 的东西,所以我们默默地创建它以满足需要
SQL> create table t as select rownum x
2 from dual connect by level <= 10;
Table created.
SQL>
SQL> select type_name from user_types;
no rows selected
SQL>
SQL> select cast(collect(x) as sys.odcinumberlist) from t;
CAST(COLLECT(X)ASSYS.ODCINUMBERLIST)
----------------------------------------------------------------
ODCINUMBERLIST(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
1 row selected.
SQL>
SQL> select type_name from user_types;
TYPE_NAME
----------------------------------------------------------------
ST000012SwVFQsQ4m5aVQ27Pg9mw=
1 row selected.
SQL>
SQL>
SQL> select text from user_source
2 where name = 'ST000012SwVFQsQ4m5aVQ27Pg9mw=';
TEXT
----------------------------------------------------------------
TYPE "ST000012SwVFQsQ4m5aVQ27Pg9mw=" AS TABLE OF NUMBER
附录 - 避免类型
的解决方法SQL> select cast(multiset(select x from t) as sys.odcinumberlist) from dual;
CAST(MULTISET(SELECTXFROMT)ASSYS.ODCINUMBERLIST)
----------------------------------------------------------------------------
ODCINUMBERLIST(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)