gpt4 book ai didi

oracle - 综合 TABLE 类型显示在 ALL_COLL_TYPES 中,但 OBJECT 类型不显示在 Oracle 18c 的 ALL_TYPES 中

转载 作者:行者123 更新时间:2023-12-04 07:46:01 27 4
gpt4 key购买 nike

创建以下内容时:

create view v (a, b) as select 1, 2 from dual;

create or replace package p as
type t is table of v%rowtype;
function f return t pipelined;
end p;
/
我可以在字典中看到一些合成类型:
select o.object_name, s.line, s.text
from all_objects o
join all_source s on o.owner = s.owner and o.object_name = s.name
where o.owner = 'TEST'
and o.object_name like 'SYS_PLSQL_%'
order by 1;
导致:
|OBJECT_NAME               |LINE|TEXT                                                                            |
|--------------------------|----|--------------------------------------------------------------------------------|
|SYS_PLSQL_3473F824_9_1 |1 |type SYS_PLSQL_3473F824_9_1 as table of "TEST"."SYS_PLSQL_56AACD46_15_1";|
|SYS_PLSQL_3473F824_DUMMY_1|1 |type SYS_PLSQL_3473F824_DUMMY_1 as table of number; |
|SYS_PLSQL_56AACD46_15_1 |1 |type SYS_PLSQL_56AACD46_15_1 as object ("A" NUMBER, |
|SYS_PLSQL_56AACD46_15_1 |2 |"B" NUMBER); |
|SYS_PLSQL_56AACD46_DUMMY_1|1 |type SYS_PLSQL_56AACD46_DUMMY_1 as table of number; |
这些都出现在 ALL_OBJECTS , 但只有集合类型也出现在 ALL_COLL_TYPES . OBJECTALL_TYPES 中找不到类型:
select type_name, elem_type_name 
from all_coll_types
where owner = 'TEST' and type_name like 'SYS_PLSQL_%'
union all
select type_name, null as elem_type_name
from all_types
where owner = 'TEST' and type_name like 'SYS_PLSQL_%';
导致
|TYPE_NAME                 |ELEM_TYPE_NAME         |
|--------------------------|-----------------------|
|SYS_PLSQL_3473F824_9_1 |SYS_PLSQL_56AACD46_15_1|
|SYS_PLSQL_3473F824_DUMMY_1|NUMBER |
|SYS_PLSQL_56AACD46_DUMMY_1|NUMBER |
这是 ALL_TYPES 定义中的错误吗? ,或者 SYS_PLSQL_56AACD46_15_1 有充分的理由吗?不上市?毕竟出现在别处,具体引用自 ALL_COLL_TYPES.ELEM_TYPE_NAME对于 SYS_PLSQL_3473F824_9_1我正在使用 Oracle Database 18c Express Edition Release 18.0.0.0.0

最佳答案

可能只是因为它不需要。可以从 SQL 间接引用集合类型:

select * from table(p.f);
但是对象类型不能。
类型未出现在 all_objects 中,并且集合类型未出现在 all_coll_types 中,如果您只声明它或只在过程中使用它:
create or replace package p as
type t is table of v%rowtype;
end p;
/
或者
create or replace package p as
type t is table of v%rowtype;
procedure p (v_t in out t);
end p;
/
使用这两个包规范,您的查询返回零行。一旦添加了可能从 SQL 上下文调用的公共(public)引用,即返回该类型的函数,数据字典需要知道它。
但是你不能直接引用集合的元素类型——如果你有一个函数返回 v%rowtype那么它不需要是它自己的合成类型,并且该类型的变量与合成元素类型兼容。
所以SQL需要能够处理集合类型,需要在 all_coll_types中看到做到这一点(大概 - 谁知道引擎盖下发生了什么);集合类型和记录类型之间的链接是通过 elem_type_name .记录类型不能使用,所以不需要在 all_types中列出- 正如文档所说,这仅适用于对象类型,因此无论如何记录类型都不会真正适合那里。
同样,集合类型出现在 all_plsql_types一旦它被宣布,即使它没有被使用;但是元素(记录)类型永远不会出现在那里,因为它不能被引用。
db<>fiddle

关于oracle - 综合 TABLE 类型显示在 ALL_COLL_TYPES 中,但 OBJECT 类型不显示在 Oracle 18c 的 ALL_TYPES 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67192859/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com