Тип Изменения / Развития Пользовательская Подпись Конструктора Функция Подпись (PL / SQL) - PullRequest
1 голос
/ 24 января 2020

Как можно развить сигнатуру пользовательской функции конструктора, заданную пользователем?

Учитывая Oracle PL / SQL пользовательский тип, который имеет табличные зависимости, вместо того, чтобы заменять их инструкциями create / replace, которые мне нужны развивать эти типы. Я нашел Oracle документацию о том, как удалять / добавлять атрибуты и удалять / добавлять функции-члены с помощью операторов alter, но я не вижу информации о том, как развить сигнатуру функции конструктора. Мне нужно сделать это без создания новой таблицы / типа и переноса данных в новый обновленный тип. В моем случае использование 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;

1 Ответ

1 голос
/ 24 января 2020

Оказывается, что утверждение 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;
...