SERPland Flugverkehr/Airtraffic Zürich – Auto Direktimport Dänemark – Disneyland Paris – Legoland Deutschland

10Jan/080

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;

Related Posts:

Comments (0) Trackbacks (0)

No comments yet.


Leave a comment

No trackbacks yet.