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.