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: hat eine Tabelle eine Spalte mit bestimmten Kriterien?

Dieses Thema im Forum "Oracle" wurde erstellt von Babsi, 4 Juli 2019.

  1. Babsi

    Babsi Fleissiger Benutzer

    Ich hab das eins zu eins übernommen, und ein paar fehlermeldungen, kann das aber nicht wirklich finden:

    create or replace Function f_checktables(slotName in varchar2)
    return PLS_INTEGER
    as
    l_count integer;
    l_first_column varchar(128);
    l_column_name varchar(128);
    l_sequence_name varchar(128);

    begin
    -- teste ob es wenigstens eine Spalte mit WID endet
    SELECT count(*)
    INTO l_count
    FROM USER_TAB_COLS
    WHERE TABLE_NAME = upper(slotname)
    AND column_name = l_column;

    -- Keine Spalte mit _WID am Ende vorhanden - hole den Namen der ersten Spalte der Tabelle.
    IF l_count = 0 THEN
    SELECT column_name


    INTO l_column
    FROM USER_TAB_COLS
    WHERE TABLE_NAME = upper(slotname)
    ORDER BY column_id --<< nach der Reihenfolge sortieren
    FETCH FIRST 1 ROWS ONLY; --<< nur eine Zeile zurückgeben

    -- neuen Namen erzeugen
    l_column_name := l_column ||'_WID';

    -- und Spalte hinzufügen.
    EXECUTE IMMEDIATE 'ALTER TABLE '||slotname||' ADD COLUMN '||l_column||' VARCHAR2(100)';
    END IF;

    -- keine Ahnung ob ich das richtig verstanden habe.
    l_sequence_name := 'BI_ADMIN_||l_column_name;

    SELECT count(*)
    INTO l_count
    FROM user_sequences
    WHERE sequence_name = l_sequence_name;

    /*IF l_count = 0 THEN
    EXECUTE IMMEDIATE 'CREATE SEQUENCE '||l_sequence_name;
    END IF;*/

    RETURN 1;
    end;
    /


    fehlermeldung:
    19/9 PL/SQL: SQL Statement ignored
    24/9 PL/SQL: ORA-00933: SQL-Befehl wurde nicht korrekt beendet
    42/28 PLS-00103: Fand das Symbol "CREATE" als eines der folgenden erwartet wurde: * & = - + ; < / > at in is mod remainder not rem <an exponent (**)> <> or != or ~= >= <= <> and or like like2 like4 likec between || multiset member submultiset
    Fehler: Compilerlog prüfen

    Ich hatte Create auch schon auskommentiert und in dem 2. select fehlt der From Teil, ich fidne den Fehler nicht
     
  2. castorp

    castorp Datenbank-Guru

    Da waren ein paar Tippfehler drin.

    Code:
    create or replace function f_checktables(slotName in varchar2)
      return PLS_INTEGER
    as
      l_count integer;
      l_first_column  varchar(128);
      l_column        varchar(128);  --<< hat gefehlt
      l_column_name   varchar(128);
      l_sequence_name varchar(128);
    begin
      -- teste ob es wenigstens eine Spalte mit WID endet
      SELECT count(*)
         INTO l_count
      FROM USER_TAB_COLS
      WHERE TABLE_NAME = upper(slotname)
        AND column_name LIKE '%_WID';
    
      -- Keine Spalte mit _WID am Ende vorhanden - hole den Namen der ersten Spalte der Tabelle.
      IF l_count = 0 THEN
        SELECT column_name
           INTO l_column
        FROM user_tab_cols --<< hat gefehlt
        WHERE TABLE_NAME = upper(slotname)
        ORDER BY column_id  --<< nach der Reihenfolge sortieren
        FETCH FIRST 1 ROWS ONLY; --<< nur eine Zeile zurückgeben
       
        -- neuen Namen erzeugen
        l_column_name := l_column ||'_WID';
     
        -- und Spalte hinzufügen.
        EXECUTE IMMEDIATE 'ALTER TABLE '||slotname||' ADD COLUMN '||l_column||' VARCHAR2(100)';
      END IF;
    
      -- keine Ahnung ob ich das richtig verstanden habe.
      l_sequence_name := 'BI_ADMIN_'||l_column_name; --<< hier hat ein ' gefehlt
      SELECT count(*)
        INTO l_count
      FROM user_sequences
      WHERE sequence_name = l_sequence_name;
    
      IF l_count = 0 THEN
        EXECUTE IMMEDIATE 'CREATE SEQUENCE '||l_sequence_name;
      END IF;
      RETURN 1;
    end;
    /
    
     
  3. akretschmer

    akretschmer Datenbank-Guru

    müffelt nach fehlendem Quoting
     
  4. Babsi

    Babsi Fleissiger Benutzer

    Habt vielen dank, ich glaub ich mach erst mal ne Pause ....
     
  5. Babsi

    Babsi Fleissiger Benutzer

    Guten Morgen,

    wochendenende dazwischen, und, gerade noch mal drüber geschaut.

    Jetzt läuft es, war der erste teil der Funktion, nun versuche ich mich weiter.
    Vielen Dank!!!

    Gruß, Babsi
     
  6. Babsi

    Babsi Fleissiger Benutzer

    was hat der denn gegen den teil hier???
    SELECT column_name
    INTO l_column
    FROM user_tab_cols
    WHERE TABLE_NAME = upper(EXTEND)
    ORDER BY column_id
    FETCH FIRST 1 ROWS ONLY;

    Wieso ist der nicht rcihtig beendet?
     
  7. akretschmer

    akretschmer Datenbank-Guru

    fehlt da ein ; nach dem ORDER BY column_id ?
     
  8. Babsi

    Babsi Fleissiger Benutzer

    Der hat ein Problem mit dem
    FETCH FIRST ROWS ONLY;
     
  9. castorp

    castorp Datenbank-Guru

    Dann verwendest Du eine veraltete Oracle Version.
     
  10. Babsi

    Babsi Fleissiger Benutzer

    Hi,
    hm, das hatte ich schon probiert.


    sec...
     
  11. Babsi

    Babsi Fleissiger Benutzer

    Im netz kann ich das findrn
    select
    ename
    from
    emp
    order by ename
    fetch first 5 rows only;


    aber auch das mag er nicht...
     
  12. Babsi

    Babsi Fleissiger Benutzer

    wenn ich das alleine mal ausprobieren:

    SELECT column_name
    FROM user_tab_cols
    WHERE TABLE_NAME = upper('EXTEND')
    ORDER BY column_id ;
    FETCH FIRST 1 ROWS ONLY;

    Fehlerbericht- unbekannter Befehl
     
  13. Babsi

    Babsi Fleissiger Benutzer

    ich hab das jetzt so, so gehts.
    WHERE TABLE_NAME = upper(slotname)
    and ROWNUM = 1
    ORDER BY column_id;
     
  14. castorp

    castorp Datenbank-Guru

    Deine Lösung liefert aber leider nicht das richtige Ergebnis.

    Der Wert für rownum wird vor dem Sortieren festgelegt.

    Deine Version liefert einen beliebigen "erste" Datensatz zurück und sortiert dieses Ergebnis (mit nur einer Zeile).

    Wenn Du gezwungen bist, mit einer nicht mehr unterstützten Oracle Version zu arbeiten, dann musst Du das so machen:
    Code:
    select column_name
    from (
      select column_name, rownum as rn
      from user_tab_cols
      order by column_id
    )
    where rn = 1;
     
  15. Babsi

    Babsi Fleissiger Benutzer

    Hallo Castorp,

    "er Wert für rownum wird vor dem Sortieren festgelegt."
    ah.. O.K.
    Ja, kann sein, das das an meiner Version liegt...
     
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