You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建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错误。

修正步骤

  1. 修改行类型定义,移除属性后的NOT NULL:
CREATE OR REPLACE TYPE Felipe.T_Copy_Inconsistencies_Row AS OBJECT(
    book_id INT,
    branch_id INT,
    copies_diff INT
);
  1. 重新创建依赖的表类型:
CREATE OR REPLACE TYPE Felipe.T_Copy_Inconsistencies_Tab IS TABLE OF Felipe.T_Copy_Inconsistencies_Row;
  1. 重新编译包:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:35:16