作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
创建以下内容时:
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
.
OBJECT
在
ALL_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
那么它不需要是它自己的合成类型,并且该类型的变量与合成元素类型兼容。
all_coll_types
中看到做到这一点(大概 - 谁知道引擎盖下发生了什么);集合类型和记录类型之间的链接是通过
elem_type_name
.记录类型不能使用,所以不需要在
all_types
中列出- 正如文档所说,这仅适用于对象类型,因此无论如何记录类型都不会真正适合那里。
all_plsql_types
一旦它被宣布,即使它没有被使用;但是元素(记录)类型永远不会出现在那里,因为它不能被引用。
关于oracle - 综合 TABLE 类型显示在 ALL_COLL_TYPES 中,但 OBJECT 类型不显示在 Oracle 18c 的 ALL_TYPES 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67192859/
创建以下内容时: create view v (a, b) as select 1, 2 from dual; create or replace package p as type t is t
我是一名优秀的程序员,十分优秀!