oracle - 在许多包中使用的带有声明但没有定义的类型

标签 oracle plsql

我刚刚通过分析一些遗留代码开始了我对 Oracle 和 PL/SQL 的探索。

我遇到了以下似乎没有任何定义的声明 (BODY)

CREATE OR REPLACE TYPE "TY_STRING_T";

但在许多包中的许多地方使用。例如像这样。
otc ty_string_t := ty_string_t();

我知道这就像创建一个类 ty_string_t 的实例.

然后它被用作例如一个集合。
otc.EXTEND;
otc(1) := 'test';

为什么这种类型是这样使用的,而根本没有定义呢?我错过了什么?在类型下的 SQL Developer 中,当我扩展节点时没有正文部分。

编辑:

all_dependencies 中搜索依赖项表给出了以下结果。
SELECT * FROM all_dependencies WHERE name = `TY_STRING_T`;
------------------------------------------------------------------------------------------------------------------------------
| OWNER | NAME        | TYPE | REFERENCED_OWNER | REFERENCED_NAME | REFERENCED_TYPE | REFERENCED_LINK_NAME | DEPENDENCY_TYPE |
------------------------------------------------------------------------------------------------------------------------------
| AAA   | TY_STRING_T | TYPE | SYS              | STANDARD        | PACKAGE         | (null)               | HARD            |
------------------------------------------------------------------------------------------------------------------------------

最佳答案

你显示的声明:

CREATE OR REPLACE TYPE "TY_STRING_T";

创建 an incomplete object type :

Use the CREATE TYPE statement to create the specification of an object type, a SQLJ object type, a named varying array (varray), a nested table type, or an incomplete object type.



...

An incomplete type is a type created by a forward type definition. It is called "incomplete" because it has a name but no attributes or methods. It can be referenced by other types, and so can be used to define types that refer to each other. However, you must fully specify the type before you can use it to create a table or an object column or a column of a nested table type.



object-relational developer's guide有更多关于不完整类型的信息和使用它们的例子。

那不是你所拥有的。您正在实例化和填充一个 varray,而不是一个对象类型。 It would not compile the PL/SQL code with the incomplete type - 你会得到一个 PLS-00311: the declaration of "TY_STRING_T" is incomplete or malformed编译错误。

从评论中,您没有覆盖 PL/SQL 类型和(来自聊天)all_dependencies view 确认您的包依赖于 SQL 级别类型。但它不能像你认为的那样定义。

您可以使用以下命令检查类型的当前实际定义
select dbms_metadata.get_ddl('TYPE', 'TY_STRING_T') from dual;

使用您显示的语句返回:
DBMS_METADATA.GET_DDL('TYPE','TY_STRING_T')                                    
--------------------------------------------------------------------------------

  CREATE OR REPLACE TYPE "STACKOVERFLOW"."TY_STRING_T" ;

再次从聊天中,当你运行时,你真的看到:
CREATE OR REPLACE TYPE "AAA"."TY_STRING_T" as table of varchar2(32767);

这更有意义。 Oracle 不会添加 as table...部分本身 - 因为它会很高兴将它作为不完整的对象类型;你只是无法使用它,当然不是好像它是一个varray。

所以你的代码库的其他部分用新的、完整的定义重新创建了类型;或者有人手动重新创建了类型(在创建引用它的包之前)。如果我不得不推测,我认为这可能是源代码控制问题 - 不完整的代码被检入并发送,并且必须在安装时在每个环境中即时更正。或者可能是安装后代码已更改为不再正确的版本。

类型名称表明它总是应该是一个字符串表,而不是一个对象类型;并且您发现的 create 命令的截断版本实际上永远不会创建一个 varray。

你在你的理解中并没有真正遗漏任何东西,只是你所看到的并没有反射(reflect)现实。

关于oracle - 在许多包中使用的带有声明但没有定义的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33751702/

相关文章:

sql - Oracle APEX 主详细信息页面创建 : ORA-06531 error

oracle - 批量收集到表类型的对象

sql - 比较两个分隔字符串并在 PL SQL 中返回相应的值

sql - 操作集合

java - 在多个交易中保持搜索结果一致

java - 如何解决@OneToMany关系中重复列名异常

sql - Oracle 认为表在 alter 期间不存在

sql - 左联接中的歧义(仅适用于Oracle?)

sql - 当 0 应该存在时,使用 count 我的元组以 1 出现?

oracle - 返回 bool 值的函数在 "expression is of wrong type"上失败