Fehlermeldung und ich finde den Fehler nicht

MuffinMAn

Neuer Benutzer
Beiträge
3
Code:
USE proglanguage;

DROP PROCEDURE IF EXISTS p_new_lang;

DELIMITER //
CREATE PROCEDURE p_new_lang
(new_lang VARCHAR(50), new_ver VARCHAR(25), new_flavor VARCHAR(50), new_usedlibs TEXT, new_used_os VARCHAR (50), new_revision VARCHAR(50))

BEGIN

-- Check if language and flavor version already exists
    IF (new_lang = t_languages.lang AND new_flavor = t_languages.flavor) THEN

-- Update table with new Info if language and flavor already exists   
        UPDATE t_languages
            SET 
            ver=t_languages.ver+'/ '+new_ver,
            used_os=t_languages.used_os+'/ '+new_used_os,
            revision=t_languages.revision+'/ '+new_revision   
        WHERE lang=new_lang;

--Check if the table already has used libs input
        IF (t_languages.usedlibs IS NULL) THEN
            UPDATE t_languages SET usedlibs=new_usedlibs WHERE lang=new_lang;

        ELSE
            UPDATE t_languages SET usedlibs=t_languages.usedlibs+', '+new_usedlibs WHERE t_languages.lang=new_lang;
    
        END IF;

-- If language doesn't exist insert it into the table
    ELSE

        IF (new_usedlibs IS NULL) THEN
                INSERT INTO t_languages
                (lang, ver, flavor, used_os, revision) VALUES
                (new_lang, new_ver, new_flavor, new_used_os, new_revision);

        ELSE
            INSERT INTO t_languages
            (lang, ver, flavor, usedlibs, used_os, revision) VALUES
            (new_lang, new_ver, new_flavor, new_usedlibs, new_used_os, new_revision);

        END IF;
    END IF;
END //
DELIMITER ;

Oben steh alles was ich für die Prozedur geschrieben habe, Ich kriege allerdings immernoch den Fehler
Code:
ERROR 1109 (42S02): Unknown table 't_languages' in field list

Meine Derzeitigen Tabellen sind
Code:
+------------------------+
| Tables_in_proglanguage |
+------------------------+
| t_commands             |
| t_languages            |
+------------------------+
Falls jemand irgendeine Vermutung hat warum es nicht funktioniert sagt es mir bitte, Ich bin seit 3 Tagen am probieren woran es liegen könnte aber ich finde den Fehler nicht, andere Foren meinte das ich ein FROM Vergessen habe, diese Beziehen sich allerdings alle auf eine SELECT abfrage und die habe ich nicht.

Schonmal danke im voraus!

PS: EVENTUELL FRAGE ICH NOCH AUF ANDEREN FOREN, FALLS ES DAZU KOMMT LINKE ICH DIESE
 
Werbung:
Ein häufiges Problem ist die Verwendung von Backticks bei der Erzeugung.
create table t_languages ...
erzeugt eine andere Tabelle als
create table `T_languages` ...
oder noch gemeiner
create table `t_languages ` ... (mit führendem oder folgendem Leerzeichen)

Während Groß-/Kleinschreibung bei der Anwendung der Objektnamen keine Rolle spielt, wenn durchgängig ohne Backticks gearbeitet wird (beginnend bei Create Table), muss mit der Verwendung von Backticks immer die exakte Schreibweise eingehalten werden.
Etwas unwahrscheinlich aber auch möglich ist eine unterschiedliche Codierung von Buchstaben, die nicht offensichtlich ist. Hier käme der Unterstrich dafür in Frage. Passiert am ehestens bspw. bei einer "schief" codierten Webseite, deren Quelltext man kopiert oder vielleicht in einer DOS Box mit ungewöhnlichem Charset.

Das nächste ist der DB Kontext, -Session oder auch die Datenbank selbst.
Wenn das Anlegen der SP separat erfolgt, kann dabei versehentlich zu einer anderen DB gewechselt worden sein oder es wird ein anderer User / Rechtekontext verwendet. Das sollte nicht passieren, wenn Create table und Create Procedure in der gleichen Sitzung erfolgen. Eine Variante davon ist u.U. die Anmeldung mit 'root'@'specificHost' / 'root'@'127.0.0.1'/ 'root'@'localhost', da kenne ich mich aber nicht aus. Insgesamt kenne ich mich bei mysql nicht gut aus, es gibt also vielleicht auch noch andere Fehlerquellen.

In einem unordentlichen Script könnte es sogar sein, dass die Tabelle zwar existiert, ein Scriptrest sie aber zwischendurch bzw. vor dem Erzeugen der SP wieder löscht. Folgt das DDL Script generell dem Schema
drop <object> if exists
create <object>
dann gelingt der erste Teil immer "geräuschlos". Falls das folgende Create Table dann unbemerkt fehlschlägt und die Scripte mehrteilig sind, kann je nach Aufrufreihenfolge, die Tabelle verschwunden sein...
 
Sehr vielen Dank für die Schnelle Nachricht :D

Das mit den Back Ticks wusste ich nicht, Ich sitze aber auch erst seit Anfang der Woche an MySQL, dafür also schonmal danke und ich probiere es aus sobald ich wieder am PC bin.

Die Tabelle und Procedure habe ich beide in der gleichen Sitzung erstellt also sollte es daran nicht liegen.

ich lösche die Tabelle auch nicht, außer ich erstelle die Tabelle neu.

Gibt es eine Möglickeit eine Nachricht im Skript einzubauen die Sagt wo es fehlgeschlagen ist? Dann könnte ich es eins nach dem anderen eingrenzen falls die Backticks nicht helfen.
 
Ich hab mir jetzt mal die Logik der Procedur angeschaut.
Wahrscheinlich ist es eher die Art des Zugriffs auf die Tabelle.
Code:
  IF (new_lang = t_languages.lang AND new_flavor = t_languages.flavor) THEN
Das ergibt keinen Sinn. Du kannst in SQL auf diese Art keinen Tabellenzugriff machen.
Denk mal kurz drüber nach, welchen Datensatz sollte dieser Befehl mit der Konstante new_lang vergleichen?
Du musst das über ein Select Statement durchführen. Also
Code:
Select 1 from t_languages where lang=new_lang
oder etwas ähnliches, jenachdem wie Du abprüfen willst.
 
Gibt es eine Möglickeit eine Nachricht im Skript einzubauen die Sagt wo es fehlgeschlagen ist?
Weiß ich nicht für mySQL.

Meine Tipps

Gute bzw. bessere Fehlermeldungen erhälst Du bei der Datenbank postgres.

Ich sitze aber auch erst seit Anfang der Woche an MySQL,
Wenn Du das freiwillig machst und SQL von Grund auf lernen möchtest, ist das ein weiterer Grund, nicht mySQL oder MariaDB zu verwenden.
 
Soo,

hab da was gesehen.

Ich denke mal das du hier eine String anhängen möchtest :-)

Code:
SET
ver=t_languages.ver+'/ '+new_ver,     used_os=t_languages.used_os+'/ '+new_used_os,


Das geht leider so nicht ( auch nicht in postgres :-) ). Denke mal das du das von PHP übernommen hast.

Bei MySQL musst du das mit CONCAT machen. Also ver = CONCAT(t_languages.ver, '/ ', new_ver) :

Das hast du mehrfavh im Query gemacht

Gruß Bernd
 
Moin, vielen dank für die ganzen hilfreichen Nachrichten, Ich kam gestern Abend leider nicht mehr an den PC und bin erst heute Abend wieder zuhause und probiere dann die ganzen tipps aus.
Das geht leider so nicht ( auch nicht in postgres :-) ). Denke mal das du das von PHP übernommen hast.

Nicht ganz falsch ich habe ein bisschen vorwissen von cpp und nicht erwartet das es anders ist, was eigentlich sinn macht also vielen dank :D.

Wenn Du das freiwillig machst und SQL von Grund auf lernen möchtest, ist das ein weiterer Grund, nicht mySQL oder MariaDB zu verwenden.

Es ist nicht freiwillig ich mache grade eine Umschulung und in dem Abschnitt "Grundlagen Datenbanken" wollte unser Dozent das wir MariaDB benutzen, Ich bin aber offen für so ziemlich alles. Irgendwelche guten Alternativen für MariaDB?


Ich habe auch schon den anderen Thread gesehen wo jemand nach unterschieden zwischen mySQL und Postgres gefragt hat und wollte mir den nachher ein bisschen durchlesen.

Denk mal kurz drüber nach, welchen Datensatz sollte dieser Befehl mit der Konstante new_lang vergleichen?
Du musst das über ein Select Statement durchführen. Also
Code:
Select 1 from t_languages where lang=new_lang
oder etwas ähnliches, jenachdem wie Du abprüfen willst.

Ich gehe mal davon aus das die 1 in einer variable dann gespeichert werden muss damit ich diese vergleichen kann? Oder verstehe ich da was falsch? Jetzt grade wählt er ja nur die 1 aus und macht nichts weiter.
oder meinst du
Code:
if (SELECT 1 from t_languages where lang=new_lang
[CODE]?

Nochmals vielen dank für die schnelle hilfe :D
 
USE proglanguage;
Das möchtest Du vielleicht nicht (Wechsel der DB). Wenn Du es möchtest, muss es konsistent sein mit allen anderen Scripten. Ist das nicht der Fall, fehlt der SP die Tabelle, weil es die falsche Datenbank ist.

Ich gehe mal davon aus das die 1 in einer variable dann gespeichert werden muss..
oder meinst du ..
Ich bin kein maria/mysql spezi, weiß nicht, was da alles geht.
Da Du einige Datensatzinhalt im Laufe deiner SP prüfst- und ich kein gutes Wissen über Maria hab-, würde ich sowas machen, "Nr Sicher":
Code:
..
  declare l_ver_exists int default 0;
  declare l_usedlibs text;
  declare l_flavor varchar(50) default '';

  -- Check if language and flavor version already exists
  Select 1, usedlibs, flavor  into l_ver_exists, l_usedlibs, l_flavor 
    from t_languages 
   where lang=new_lang;
   
  IF (l_ver_exists = 1 AND new_flavor = l_flavor ) THEN
..
Es geht sicher eleganter.
Die 3 Variablen setzt Du an den Stellen in der Prüfung ein, wo Du im Original fälschlich auf tabelle.feld zugreifst.

--Check if the table already has used libs input
Könnte sein, dass Du noch ein Leerzeichen hinter den '--' spendieren musst.

Es ist nicht freiwillig
Schade, die Alternative habe ich schon genannt: Postgres.
 
Werbung:
Zuletzt noch der Hinweis, dass Du Dir die ganze Procedur wahrscheinlich sparen kannst.
Schau Dir mal "insert on duplicate update" an.
Ein SQL Kommando würde ich immer einer SP vorziehen.
 
Zurück
Oben