1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

PL/SQL For Schleife UPDATE statement syntax error

Dieses Thema im Forum "Oracle" wurde erstellt von canberkcelik, 14 Mai 2019.

  1. canberkcelik

    canberkcelik Benutzer

    Hallo Leute,

    Ich will gerne z.B mein KW_01(Dropdown) bis KW_03 (Dropdown) nach KW_04(Dropdown) bis KW_06 (Dropdown) verschieben. Ich habe 53 column in eine Tabelle. Ich habe code geschrieben(siehe unten) aber funktioniert leider nicht richtig. Er macht sowas , wenn ich code starte.

    Outer Loop counter is kw_04 Inner Loop counter is 1
    Outer Loop counter is kw_04 Inner Loop counter is 2
    Outer Loop counter is kw_04 Inner Loop counter is 3
    Outer Loop counter is kw_05 Inner Loop counter is 1
    Outer Loop counter is kw_05 Inner Loop counter is 2
    Outer Loop counter is kw_05 Inner Loop counter is 3
    Outer Loop counter is kw_06 Inner Loop counter is 1
    Outer Loop counter is kw_06 Inner Loop counter is 2
    Outer Loop counter is kw_06 Inner Loop counter is 3

    KW_04,KW_05 und KW_06 ändert leider immer nach 3. Wie kann ich das Problem beheben? Vielen dank

    WERTE: KW_01: 1, KW_02: 2, KW_03:3, KW_4:0, KW_05:0 und KW_06:0






    DECLARE


    plsql VARCHAR2(500);

    BEGIN

    For i in (SELECT COLUMN_ID FROM ALSI_BEDARFSPLANUNG
    UNPIVOT
    (COLUMN_VALUE
    FOR COLUMN_ID IN ("KW_01", "KW_02", "KW_03", "KW_04", "KW_05", "KW_06"))
    WHERE COLUMN_ID BETWEEN 'KW_04' AND 'KW_06' and ID = 1) LOOP

    FOR o in (SELECT COLUMN_VALUE FROM ALSI_BEDARFSPLANUNG
    UNPIVOT
    (COLUMN_VALUE
    FOR COLUMN_ID IN ("KW_01", "KW_02", "KW_03", "KW_04", "KW_05", "KW_06"))
    WHERE COLUMN_ID BETWEEN 'KW_01' AND 'KW_03' and ID = 1)
    LOOP

    plsql := ' UPDATE ALSI_BEDARFSPLANUNG SET ' || i.COLUMN_ID || ' = ' || o.COLUMN_VALUE || ' where ID = 1 ';
    EXECUTE IMMEDIATE plsql;
    END LOOP;
    END LOOP;

    END;
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Wenn Du das richtig machen würdest (siehe anderer Thread von heute), wäre es trivial:

    Code:
    test=# create table canberkcelik (id serial primary key, kw int, val int);
    CREATE TABLE
    test=*# insert into canberkcelik select s, s, random()*100 from generate_series(1,5) s;
    INSERT 0 5
    test=*# select * from canberkcelik;
     id | kw | val
    ----+----+-----
      1 |  1 |  33
      2 |  2 |  48
      3 |  3 |  20
      4 |  4 |  22
      5 |  5 |  32
    (5 rows)
    
    test=*# update canberkcelik set kw=kw+3 where kw in (3,4,5);
    UPDATE 3
    test=*# select * from canberkcelik;
     id | kw | val
    ----+----+-----
      1 |  1 |  33
      2 |  2 |  48
      3 |  6 |  20
      4 |  7 |  22
      5 |  8 |  32
    (5 rows)
    
    test=*#
    
     
  3. canberkcelik

    canberkcelik Benutzer

    Ich habe fast 100.000daten für z.B. KW_1. Das war ganz andere Frage. Hast du fehler gefunden oder nicht? danke
     

    Anhänge:

    • kw2.PNG
      kw2.PNG
      Dateigröße:
      7,7 KB
      Aufrufe:
      4
  4. castorp

    castorp Datenbank-Guru

    Spalten die aufsteigend nummeriert sind, deuten fast immer auf ein falsches (nicht-normalisiertes) Datenmodell hin.
     
    ukulele, canberkcelik und Walter gefällt das.
  5. akretschmer

    akretschmer Datenbank-Guru

    Na gut...

    Code:
    test=# create table foo(id int primary key, kw1 int, kw2 int, kw3 int, kw4 int, kw5 int, kw6 int, kw7 int, kw8 int, kw9 int);
    CREATE TABLE
    test=*# insert into foo (id, kw3,kw4, kw5) values (1, 10,11,12);
    INSERT 0 1
    test=*# select * from foo;
     id | kw1 | kw2 | kw3 | kw4 | kw5 | kw6 | kw7 | kw8 | kw9
    ----+-----+-----+-----+-----+-----+-----+-----+-----+-----
      1 |     |     |  10 |  11 |  12 |     |     |     |   
    (1 row)
    
    test=*# with x as (select kw3,kw4,kw5 from foo where id = 1), y as (update foo set (kw3,kw4,kw5) = (null,null,null) where id = 1) update foo set (kw6,kw7,kw8) = (select * from x) where id = 1;
    UPDATE 1
    test=*# select * from foo;
     id | kw1 | kw2 | kw3 | kw4 | kw5 | kw6 | kw7 | kw8 | kw9
    ----+-----+-----+-----+-----+-----+-----+-----+-----+-----
      1 |     |     |  10 |  11 |  12 |  10 |  11 |  12 |   
    (1 row)
    
    test=*# rollback;
    ROLLBACK
    test=# create table foo(id int primary key, kw1 int, kw2 int, kw3 int, kw4 int, kw5 int, kw6 int, kw7 int, kw8 int, kw9 int);
    CREATE TABLE
    test=*# insert into foo (id, kw3,kw4, kw5) values (1, 10,11,12);
    INSERT 0 1
    test=*# select * from foo;
     id | kw1 | kw2 | kw3 | kw4 | kw5 | kw6 | kw7 | kw8 | kw9
    ----+-----+-----+-----+-----+-----+-----+-----+-----+-----
      1 |     |     |  10 |  11 |  12 |     |     |     |   
    (1 row)
    
    test=*# with x as (select kw3,kw4,kw5 from foo where id = 1) update foo set (kw3,kw4,kw5)=(null,null,null), (kw6,kw7,kw8) = (select * from x) where id = 1;
    UPDATE 1
    test=*# select * from foo;
     id | kw1 | kw2 | kw3 | kw4 | kw5 | kw6 | kw7 | kw8 | kw9
    ----+-----+-----+-----+-----+-----+-----+-----+-----+-----
      1 |     |     |     |     |     |  10 |  11 |  12 |   
    (1 row)
    
    test=*#
    
    Suche Dir aus, ob Du die Einträge aus (kw3,kw4,kw5) nach (kw6,kw7,kw8) kopieren oder verschieben willst. Have fun.
     
  6. canberkcelik

    canberkcelik Benutzer

    Danke für Antwort aber Wieso hast du wieder statisch gemacht? Es kann sein, dass der user zwischen kw1 und kw21 verschieben möchte.
     
    Zuletzt von einem Moderator bearbeitet: 15 Mai 2019
  7. akretschmer

    akretschmer Datenbank-Guru


    ich glaube, wir drehen uns im Kreise:

    • Dein Datenmodell ist offensichtlich kapott. Das versuchen wir Dir schon länger zu erklären
    • wenn Du da andere Parameter setzen willst - keiner hindert Dich
     
    Walter gefällt das.
  8. canberkcelik

    canberkcelik Benutzer

    Ich versuche zu kriegen. Wenn ich heute schaffe , kann ich auch hier teilen. Lg
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden