PL SQL: hat eine Tabelle eine Spalte mit bestimmten Kriterien?

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
 
Werbung:
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;
/
 
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
 
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?
 
Im netz kann ich das findrn
select
ename
from
emp
order by ename
fetch first 5 rows only;


aber auch das mag er nicht...
 
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
 
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;
 
Werbung:
Hallo Castorp,

"er Wert für rownum wird vor dem Sortieren festgelegt."
ah.. O.K.
Ja, kann sein, das das an meiner Version liegt...
 
Zurück
Oben