创建Oracle PL/SQL包时为何提示FELIPE.T_COPY_INCONSISTENCIES_TAB对象无效?
解决PLS-00905: 对象FELIPE.T_COPY_INCONSISTENCIES_TAB无效的问题
你遇到的核心问题是Oracle对象类型的属性不支持直接添加NOT NULL约束,这导致你定义的T_Copy_Inconsistencies_Row类型创建失败,依赖它的表类型T_Copy_Inconsistencies_Tab因此变为无效状态,最终触发PLS-00905错误。
修正步骤
- 修改行类型定义,移除属性后的
NOT NULL:
CREATE OR REPLACE TYPE Felipe.T_Copy_Inconsistencies_Row AS OBJECT( book_id INT, branch_id INT, copies_diff INT );
- 重新创建依赖的表类型:
CREATE OR REPLACE TYPE Felipe.T_Copy_Inconsistencies_Tab IS TABLE OF Felipe.T_Copy_Inconsistencies_Row;
- 重新编译包:
CREATE OR REPLACE PACKAGE Felipe.Copy_Inconsistencies_Pack IS FUNCTION Get_Copies_Inconsistencies RETURN Felipe.T_Copy_Inconsistencies_Tab PIPELINED; END; /
补充:实现非空约束的替代方案
如果需要确保对象属性非空,可以通过自定义构造函数来实现,示例如下:
-- 定义带构造函数的对象类型 CREATE OR REPLACE TYPE Felipe.T_Copy_Inconsistencies_Row AS OBJECT( book_id INT, branch_id INT, copies_diff INT, CONSTRUCTOR FUNCTION T_Copy_Inconsistencies_Row( p_book_id INT, p_branch_id INT, p_copies_diff INT ) RETURN SELF AS RESULT ); / -- 实现构造函数的类型体 CREATE OR REPLACE TYPE BODY Felipe.T_Copy_Inconsistencies_Row AS CONSTRUCTOR FUNCTION T_Copy_Inconsistencies_Row( p_book_id INT, p_branch_id INT, p_copies_diff INT ) RETURN SELF AS RESULT IS BEGIN IF p_book_id IS NULL OR p_branch_id IS NULL OR p_copies_diff IS NULL THEN RAISE_APPLICATION_ERROR(-20001, 'book_id、branch_id和copies_diff均不能为空'); END IF; SELF.book_id := p_book_id; SELF.branch_id := p_branch_id; SELF.copies_diff := p_copies_diff; RETURN; END; END; /
内容的提问来源于stack exchange,提问作者Akari Oozora
相关产品推荐
相关产品推荐

