Добавление многих (UDF) функций проверки в Oracle - какой метод выполняется быстрее всего

Мне нужно переместить более 50 функций проверки в Oracle. Я ищу подход, который работает быстрее всего, но также хотел бы обойтиboolean выдайте если возможно. Все возвращаемые объекты должны быть одинаковыми, чтобы приложение могло согласованно реагировать на результат и предупреждать пользователя или отображать всплывающие сообщения, которые могут нам понадобиться. Я создалvalObj для этого, но пока не уверен, что это лучший подход. Формат возврата может быть изменен, потому что внешний интерфейс, который реагирует на него, еще не разработан. В конце он будет содержать множество различных функций проверки, от целого числа, номера, телефона, электронной почты, IPv4, IPv6 и т. Д. Это то, что у меня есть до сих пор ...

/***
This is the validation object.
It stores 1 for valid, 0 for not valid and some helper text that can be relayed back to the user.
***/
create or replace type valObj as object (
    result number(1),
    resultText varchar(32000)
);

/***
Coming from ColdFusion this seems clean to me but the function
will end up being a couple thousand lines long.
***/
create or replace function isValid(v in varchar2, format in varchar2)
return valObj
is
  test number;
begin
if format = 'number' then
    begin
        test := to_number(v);
        return valObj(1,null);
        exception when VALUE_ERROR then return valObj(0,'Invalid number. Valid formats are: 12345, 12345.67, -12345, etc...');
    end;
elsif format = 'integer' then
    null; --TO DO
elsif format = 'email' then
    null; --TO DO
elsif format = 'IPv4' then
    null; --TO DO
elsif format = 'IPv6' then
    null; --TO DO
end if;
--dozens of others to follow....
end;
/

/* Example Usage in SQL */
select isValid('blah','number') from dual; -- returns: (0, Invalid number. Valid formats are: 12345, 12345.67, -12345, etc...)
select isValid('blah','number').result from dual; -- returns: 0
select isValid('blah','number').resulttext from dual; -- returns: Valid formats are: 12345, 12345.67, -12345, etc...
select isValid(1234567890.123,'number') from dual; -- returns: 1,{null}
select isValid(1234567890.123,'number').result from dual; -- returns: 1
select isValid(1234567890.123,'number').resulttext from dual; -- returns: {null}

/* Example Usage in PL/SQL */
declare
temp valObj;
begin
    temp := isValid('blah','number');
    if (temp.result = 0) then
        dbms_output.put_line(temp.resulttext);
    else
        dbms_output.put_line('Valid');
    end if;
end;
/

Мои вопросы:

При использовании его в PL / SQL я хотел бы иметь возможность сделатьboolean вместо этого проверяет вот так:if (temp.result) then но я не могу найти способ, потому что это не будет работать в SQL. Должен ли я просто добавить 3-й логический атрибут кvalObj или есть другой способ, о котором я не знаю?Эти функции проверки могут в конечном итоге вызываться в больших циклах. Зная это, это самый эффективный способ выполнить эти проверки?

Буду признателен за любую помощь. Спасибо!

ОБНОВИТЬ: Я забыл оMEMBER FUNCTIONS, Спасибо @Brian McGinity за напоминание. Поэтому я хотел бы пойти с этим методом, так как он сохраняетtype И егоfunctions инкапсулированы вместе.Будет ли разница в скорости между этим методом и автономной функцией? Будет ли это скомпилировано и сохранено так же, как автономная функция?

create or replace type isValid as object (
    result     number(1),
    resulttext varchar2(32000),
    constructor function isValid(v varchar, format varchar) return self as result );
/

create or replace type body isValid as
    constructor function isValid(v varchar, format varchar) return self as result as
        test number;
    begin
        if format = 'number' then
            begin
                test := to_number(v);
                self.result := 1;
                self.resulttext := null;
                return;
                exception when VALUE_ERROR then
                    self.result := 0;
                    self.resulttext := 'Invalid number. Valid formats are: 12345, 12345.67, -12345, etc...';
                    return;
            end;
        elsif format = 'phone' then
            null; --TO DO
        end if;
        --and many others...
    end;
end;
/

/* Example Usage in SQL */
select isValid('a','number') from dual;

/* Example Usage in PL/SQL */
declare
begin
    if (isValid('a','number').result = 1) then
        null;
    end if;
end;
/

РЕЗУЛЬТАТЫ ТЕСТА:

/* Test isValid (the object member function), this took 7 seconds to run */
declare
begin
    for i in 1 .. 2000000 loop
        if (isValid('blah','number').result = 1) then
            null;
        end if;
    end loop;
end;

/* Test isValid2 (the stand-alone function), this took 16 seconds to run */
declare
begin
    for i in 1 .. 2000000 loop
        if (isValid2('blah','number').result = 1) then
            null;
        end if;
    end loop;
end;

И то и другоеisValid а такжеisValid2 сделать точно такой же код, они просто запускают эту строкуtest := to_number(v); затем сделайте исключение, если оно не получится, и верните результат. Является ли это действительным тестом? Метод функции-члена Object на самом деле быстрее, чем автономная функция ???

Ответы на вопрос(2)

Ваш ответ на вопрос