Oracle Добавить новую функцию-член / процедуру к типу объекта - PullRequest
3 голосов
/ 11 декабря 2011

Я пытаюсь сделать следующее;скажем, я создал тип объекта в Oracle

create type test as object(
name varchar2(12),
member procedure print1);
/
create type body test is
member procedure print1 is
begin
dbms_output.put_line('Test');
end print1;
end;
/

Теперь я хочу добавить новую процедуру-член print2 - снова я могу сделать это, набрав:

alter type test
add member procedure print2 cascade;

Теперь,мой вопрос: как мне просто определить тело и добавить print2, не повторяя другие определения?Я знаю, что могу создать тест для создания или замены тела и составить список реализаций для обеих процедур, но это не практично, поскольку мне приходится поддерживать код для типов объектов, которые написали другие, и я понятия не имею, как они реализовали код, просто эти процедурыи функции существуют.

Я просматривал документацию и Интернет, но не смог найти ответ, и мне кажется глупым, что Oracle ожидает, что разработчик снова наберет все определения.

С уважением, Джордж

Ответы [ 2 ]

2 голосов
/ 12 декабря 2011

Как насчет создания процедуры, которая динамически добавляет определение к типу:

create or replace procedure add_procedure(p_new_procedure_definition varchar2)
    authid current_user
is
    v_object_type_body varchar2(32767) := 'create or replace ';
begin
    --Build string with current definitions
    for source_code in
    (
        select text
        from user_source
        where name = 'TEST'
            and type = 'TYPE BODY'
        order by line
    ) loop
        --Don't include the last "END;" yet.
        --(Huge assumption that the package ends with "END;")
        if replace(upper(trim(source_code.text)),chr(10)) <> 'END;' then
            v_object_type_body := v_object_type_body||source_code.text;
        end if;
    end loop;

    --Add new definition    
    v_object_type_body := v_object_type_body||chr(10)||
        p_new_procedure_definition||chr(10)||'end;';

    --For debugging
    --dbms_output.put_line(v_object_type_body);

    --Compile the type
    execute immediate v_object_type_body;
end;
/

Затем запустите его так:

begin
    add_procedure(
    '
    member procedure print2 is
    begin
        dbms_output.put_line(''Test2'');
    end print2;
    '
    );
end;
/

Хотя вам нужно сделать довольно большие предположения о том, как закончится пакет. Чтобы сделать это по-настоящему общим решением, вам нужно создать анализатор PL / SQL, что в принципе невозможно. И эта процедура будет работать только с 32K, если типы очень большие, вам, вероятно, потребуется использовать CLOB.

1 голос
/ 12 декабря 2011

Используйте Oracle SQL Developer, чтобы изменить тело типа.

Или используйте любой текстовый редактор, чтобы изменить исходный файл и запустить его в своем любимом приглашении SQL.

Типы объектов являются наиболее продвинутымиКонцепция программирования в Oracle.Может быть, вам лучше использовать автономные функции?

Однако я понимаю вашу мысль.AFAIK тело типа не может содержать функции, которые не перечислены в спецификации.Порядок методов также не должен иметь значения, поэтому, похоже, нет причин не использовать эту опцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...