PL/SQL Programm: Ort Erkennung – Auseinandertrennen von Ortschaften aus einem String

— Auseinandertrennen von Ortschaften aus einem String
— Beispiel String: “St. Arbogast, Götzis/St. Gallenkirch/St. Gerold”
— Soll Resultat1 : St. Arbogast
— Soll Resultat1 : Götzis
— Soll Resultat1 : St. Gallenkirch
— Soll Resultat1 : St. Gerold

create table mig2005_temp_orte
(item_nr number
,item_jahr number
,item_semester varchar2(20)
,ausb_ort varchar2(200)
,ort_oid number
,ort_name varchar2(200)
)

declare
cursor cAusb
is
select a.item_nr, a.item_jahr, a.item_semester
— , a.ausb_ziel
, a.ausb_schule
, a.ausb_ort
from tabelle_ausb a
where 1=1
and rownum <35 –test
and ausb_ort like ‘%Arb%/%/%’ –test
— order by a.ausb_ort
;
–***************************************************************************
vOrt varchar2(200);
vSonder varchar2(1) := ‘$’;
vLastPos pls_integer;
vPos pls_integer;
vLoopCount pls_integer;
vString varchar2(200);
vTemp varchar2(200);
vAnzahlSonderzeichen pls_integer;
vOrtLookupOid number;
istErstesMalGefunden boolean;
istMehrfachGefunden boolean;
–***************************************************************************
function glb_ort_lookup(pString in varchar2)
return number
is
nextVersuch boolean := false;
rHauptort glb_hauptorte_vie%ROWTYPE;
vCountMatch pls_integer := 0;
vCountFehler pls_integer := 0;
vOrtOid number;
begin
nextVersuch := false; –init
<<LookupOrte>>
begin
select *
into rHauptort
from glb_hauptorte_vie
where ort_name = pString
;
dbms_output.put_line(‘[1] Match: ‘ ||pString);
vCountMatch := vCountMatch +1;
vOrtOid := rHauptort.ort_oid;
exception
when too_many_rows
then nextVersuch := true;
when others
then
dbms_output.put_line(‘[1] Fehler: ‘ ||pString ||’ ==> ‘ ||SQLERRM );
vCountFehler := vCountFehler +1;
vOrtOid := -1;
end LookupOrte;

if nextVersuch
then
<<LookupOrteMitKanton>>
begin
select *
into rHauptort
from glb_hauptorte_vie
where ort_name = pString
and kanton is not null
;
dbms_output.put_line(‘[2] Match: ‘ ||pString);
vCountMatch := vCountMatch +1;
vOrtOid := rHauptort.ort_oid;
exception
when too_many_rows
then
dbms_output.put_line(‘[2] Fehler: ‘ ||pString ||’ ==> ‘ ||SQLERRM );
vCountFehler := vCountFehler +1;
vOrtOid := -999;
when others
then
dbms_output.put_line(‘[2] Fehler: ‘ ||pString ||’ ==> ‘ ||SQLERRM );
vCountFehler := vCountFehler +1;
vOrtOid := -1;
end LookupOrteMitKanton;
end if;
return vOrtOid;
end glb_ort_lookup;
–***************************************************************************
begin
dbms_output.put_line(‘————START————- ‘);
for rAusb in cAusb
loop
— init für jede item_NR
vOrtLookupOid := null;
istErstesMalGefunden := false;
istMehrfachGefunden := false;
— Identifizieren Sonderzeichen welche Worttrennder darstellen
vOrt := rAusb.ausb_ort;
vOrt := replace(vOrt,’/’,vSonder);
vOrt := replace(vOrt,’,’,vSonder);
vOrt := replace(vOrt,’+’,vSonder);
vOrt := replace(vOrt,’u.’,vSonder);
vOrt := replace(vOrt,’und’,vSonder);
— Blanks um die Sonderzeichen entfernen
vOrt := replace(vOrt,’ ‘ ||vSonder, vSonder);
vOrt := replace(vOrt,vSonder ||’ ‘, vSonder);
vOrt := replace(vOrt,’ ‘ ||vSonder ||’ ‘, vSonder);
— Ermitteln wieviele Sonderzeichen enthalten sind.
vTemp := TRANSLATE(UPPER(vOrt)
,’0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ .ÄÖÜÉÀÈ’
,’############################################’);
vTemp := REPLACE(vTemp,’#’);
vAnzahlSonderzeichen := LENGTH(vTemp);
if vAnzahlSonderzeichen >0
then
———————————————————————–
— Mit Sonderzeichen, also mehrfache Ortsbezeichnungen
———————————————————————–
dbms_output.put_line(‘********************************************* ‘);
dbms_output.put_line(‘AusbOrt: ‘ ||vOrt);
dbms_output.put_line(‘Anzahl Sonderzeichen :’ ||vAnzahlSonderzeichen); —
–Am schluss des Ausbildungsort noch künstlich ein Sonderzeichen zufügen.
vOrt := vOrt ||vSonder;
vAnzahlSonderzeichen := vAnzahlSonderzeichen +1;
–Init
vLastPos := 1;
vPos := 1;
vLoopCount := 0;
<<SonderzeichenSucher>>
for i in 1..vAnzahlSonderzeichen
loop
vLoopCount := vLoopCount +1;
vPos := instr(vOrt,vSonder,vLastPos+1); –ab der letzt aktuellen Position(+1) ein Sonderzeichen suchen
if vPos >0
then
dbms_output.put_line(‘———————‘);
dbms_output.put_line(‘Loop : ‘ ||vLoopCount);
dbms_output.put_line(‘Pos : ‘ ||vPos);
dbms_output.put_line(‘LastPos: ‘ ||vLastPos);
vString := substr(vOrt,vLastPos,vPos-vLastPos);
vString := replace(vString,vSonder);
dbms_output.put_line(‘String : ‘ ||vString);
vLastPos := vPos;
——————————.——————–
— Verarbeitung der aufgefundenen Strings (ort)
— Wird nur einer als Ort erkannt (Lookup ist erfolgreich
— erfogt) so wird dieser als Ausbildungsort genommen.
—————————————————
vOrtLookupOid := glb_ort_lookup(vString);

if vOrtLookupOid > 0 — ort gefunden
and NOT istErstesMalGefunden — noch nicht das 1.mal gefunden
then
dbms_output.put_line(‘Ort Lookup für String Nr. ‘ ||vLoopCount ||’ 1. korrektes Auffinden ‘);
istErstesMalGefunden := true;

elsif vOrtLookupOid > 0 — ort gefunden
and istErstesMalGefunden — das 1. mal ist bereits aufgefunden
then
dbms_output.put_line(‘Ort Lookup für String Nr. ‘ ||vLoopCount ||’ anderer Ort aus Ort-String bereits aufgefunden ‘);
istMehrfachGefunden := true;

elsif vOrtLookupOid = -1 — (-1=no_data_found -999=too_many_rows)
then
dbms_output.put_line(‘Ort Lookup für String Nr. ‘ ||vLoopCount ||’ NO_DATA_FOUND’);

elsif vOrtLookupOid = -999 — (-1=no_data_found -999=too_many_rows)
then
dbms_output.put_line(‘Ort Lookup für String Nr. ‘ ||vLoopCount ||’ TOO_MANY_ROWS’);
end if;
——————
if istErstesMalGefunden
and NOT istMehrfachGefunden
then
dbms_output.put_line(‘…. INSERT IN Tabelle ….’);
— INSERT INTO mig2005_temp_orte
else
dbms_output.put_line(‘…. KEIN Insert in Tabelle da unklar …. ‘);
end if;
——————
end if; –Pos>0
end loop; –über Ortliste mit Sonderzeichen
else
———————————————————————–
— Keine Sonderzeichen, also normale einzelne Ortsbezeichnung
———————————————————————–
dbms_output.put_line(‘==============================================’);
dbms_output.put_line(‘AusbOrt: ‘ ||vOrt);
vOrtLookupOid := glb_ort_lookup(vOrt);
dbms_output.put_line(‘…. INSERT IN Tabelle ….’);
— INSERT INTO mig2005_temp_orte
dbms_output.put_line(vOrtLookupOid);
end if;
end loop;
dbms_output.put_line(‘————ENDE————- ‘);
–dbms_output.put_line(‘Match : ‘ ||vCountMatch);
–dbms_output.put_line(‘Fehler : ‘ ||vCountFehler);

end;

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Scroll to Top