Announcement

Collapse
No announcement yet.

PLSQL - Cursor

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • PLSQL - Cursor

    Hallo, kann mir jemand bei folgendem Problem helfen?!?
    Es gibt eine Tabelle Kunde: (IDKUNDE, Name).
    In der Spalte "NAME" sind doppelte Einträge. Ich brauche eine Prozedur oder Block, mit einem cursor die alle Einträge die doppelt sind löscht, sodass nur ein Name jeweils übrig bleibt.
    Habe schonmal angefangen aber komme irgendwie nicht weiter...


    DECLARE
    v_anzahl number;
    CURSOR cur_Kunden IS SELECT NAME,
    from tblkunden // Irgendwie müsste hier noch abgefragt werden, vielleicht mit "having" ... dass er nur datensätze speichert, die eben doppelt sind;
    v_kundensatz cur_Kunden%ROWTYPE;
    Begin
    select count(*) into v_anzahl from cur_Kunden;
    OPEN cur_Kunden;
    FETCH cur_Kunden INTO v_kundensatz;
    for i IN 1 .. v_anzahl LOOP
    // Befehl zum löschen des Datensatzes
    FETCH cur_Kunden INTO v_kundensatz;
    END LOOP;
    CLOSE cur_Kunden;
    END;



    wäre super wenn mir jemand helfen könnte =)

  • #2
    native SQL

    Hallo goodfella,

    falls es egal ist, welche Kunden (ID) gelöscht werden, lässt sich dein Problem auch mit einem nativen SQL-Statement lösen.

    Code:
    -- Tabelle
    CREATE Table KUNDEN(
        ID   number        not NULL
      , NAME varchar2(100) not NULL
    )
    /
    Table created.
    
    -- Testdaten
    BEGIN
      for i in 1 .. 10  loop
        INSERT into KUNDEN values( i, 'Kunde-' || to_char(mod(i,3),'FM09') );
      end loop;
      COMMIT;
    END;
    /
    PL/SQL procedure successfully completed.
    
    -- vorher
    column ID   format 99
    column NAME format A10
    SELECT * from KUNDEN order by NAME
    /
     ID NAME      
    --- ----------
      9 Kunde-00  
      3 Kunde-00  
      6 Kunde-00  
      1 Kunde-01  
      4 Kunde-01  
     10 Kunde-01  
      7 Kunde-01  
      8 Kunde-02  
      2 Kunde-02  
      5 Kunde-02  
    
    10 rows selected.
    
    -- doppelte Kunden löschen
    DELETE KUNDEN k1
    where  exists(
             SELECT 1
             from   KUNDEN k2
             where  k2.NAME = k1.NAME
             and    k2.ID   > k1.ID
          )
    /
    7 rows deleted.
    
    -- nachher
    SELECT * from KUNDEN order by NAME
    /
     ID NAME      
    --- ----------
      9 Kunde-00  
     10 Kunde-01  
      8 Kunde-02  
    
    3 rows selected.
    Siegfried

    Comment


    • #3
      Dankeschön das hilft mir weiter - vielen dank!!!

      Comment

      Working...
      X