Alter / Evolve类型用户定义的构造函数签名(PL / SQL)

问题描述 投票:0回答:1

如何发展用户定义的构造函数签名?

鉴于具有表依赖项的Oracle PL / SQL用户定义类型,而不是用create / replace语句代替它们,我需要发展这些类型。我通过alter语句找到了Oracle documentation on how to drop/add attributes, and drop/add member functions,但没有看到有关如何演化构造函数签名的信息。我需要执行此操作,而无需创建新表/类型并将数据迁移到新的更新类型。就我而言,使用FORCE也不起作用。

例如,给定以下类型,我如何更新用户定义的构造函数签名以包括要在初始化期间使用的新参数?

-- Create new type
CREATE OR REPLACE TYPE test_type AS OBJECT (
    test_attribute NUMBER(1, 0),

    CONSTRUCTOR FUNCTION test_type(
        p_test_attribute NUMBER DEFAULT NULL
    )
    RETURN SELF AS RESULT
);

-- Make this new type have table dependents
CREATE OR REPLACE TYPE test_type_table 
    AS TABLE OF test_type;

CREATE TYPE test_child_obj AS OBJECT (
    test_type_field test_type_table
);

-- Add new attribute via alter statement
ALTER TYPE test_type
    ADD ATTRIBUTE (new_attribute NUMBER)
    CASCADE NOT INCLUDING TABLE DATA;

我想将构造函数签名更新为以下内容:

CONSTRUCTOR FUNCTION test_type(
    p_test_attribute NUMBER DEFAULT NULL,
    p_new_attribute NUMBER DEFAULT NULL
)
RETURN SELF AS RESULT

我希望会有如下的alter语句,但是我找不到合适的alter语句。请帮助。

ALTER TYPE test_type
    ADD CONSTRUCTOR FUNCTION test_type(
        p_test_attribute NUMBER DEFAULT NULL,
        p_new_attribute NUMBER DEFAULT NULL
    )
    RETURN SELF AS RESULT
    CASCADE NOT INCLUDING TABLE DATA;
oracle plsql constructor alter
1个回答
0
投票

事实证明,alter语句实际上是上面所述和下面所示的那个。但是,您可能会遇到“与此测试相匹配的'test_type'的声明太多”。在我真正的问题中,问题是我所有的构造函数参数都具有默认的NULL值,并且与我的原始构造函数都具有默认的NULL参数冲突。如果删除DEFAULT NULL,则可以添加新的构造函数。

ALTER TYPE test_type
    ADD CONSTRUCTOR FUNCTION test_type(
        p_test_attribute NUMBER DEFAULT NULL,
        p_new_attribute NUMBER DEFAULT NULL
    )
    RETURN SELF AS RESULT
    CASCADE NOT INCLUDING TABLE DATA;
© www.soinside.com 2019 - 2024. All rights reserved.