Hinzufügen vieler Validierungsfunktionen (UDFs) zu Oracle - Welche Methode wird am schnellsten ausgeführt?

Ich muss mehr als 50 Validierungsfunktionen in Oracle einbinden. Ich bin auf der Suche nach dem Ansatz, der am schnellsten läuft, möchte aber auch einen umgehenboolean Ausgabe, wenn möglich. Das Rückgabeobjekt für alle muss dasselbe sein, damit die Anwendung auf das Ergebnis auf konsistente Weise reagieren und den Benutzer benachrichtigen oder alle Popups und Meldungen anzeigen kann, die wir möglicherweise benötigen. Ich habe einevalObj dafür, aber noch nicht sicher, ob das der beste Ansatz ist. Das Rückgabeformat kann geändert werden, da das Front-End, das darauf reagiert, noch nicht entwickelt wurde. Am Ende wird es viele verschiedene Validierungsfunktionen enthalten, von Ganzzahl, Nummer, Telefon, E-Mail, IPv4, IPv6 usw. ... Dies ist, was ich bisher habe ...

/***
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;
/

Meine Fragen sind:

Wenn ich es in PL / SQL verwende, würde ich es gerne tun könnenboolean prüft stattdessen wie folgt:if (temp.result) then Aber ich kann keinen Weg finden, weil das in SQL nicht funktioniert. Sollte ich nur ein drittes boolesches Attribut zu dem hinzufügen?valObj Oder gibt es einen anderen Weg, den ich nicht kenne?Diese Validierungsfunktionen können in großen Schleifen aufgerufen werden. Ist dies der effizienteste Weg, um diese Validierungen durchzuführen?

Ich würde mich über jede Hilfe freuen. Vielen Dank!

AKTUALISIEREN: Ich habe es vergessenMEMBER FUNCTIONS. Vielen Dank an Brian McGinity, der mich daran erinnert hat. Ich würde also gerne mit dieser Methode weitermachen, da sie dietype und seinfunctions zusammen eingekapselt.Gibt es einen Geschwindigkeitsunterschied zwischen dieser Methode und einer eigenständigen Funktion? Würde dies wie eine eigenständige Funktion kompiliert und gespeichert?

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;
/

TESTERGEBNISSE:

/* 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;

BeideisValid undisValid2 Tun Sie genau den gleichen Code, führen Sie einfach diese Zeile austest := to_number(v); Führen Sie dann die Ausnahme aus, wenn sie fehlschlägt, und geben Sie das Ergebnis zurück. Scheint dies ein gültiger Test zu sein? Die Methode Object member function ist tatsächlich schneller als eine eigenständige Funktion.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage