Peter: Problem mit Import von SQL-Files (phpmyadmin)

Hallo,

folgende SQL-Datei möchte ich importieren:
localhost ~ #> mysql -u root -p < file.sql

  
use database;  
DROP PROCEDURE IF EXISTS foo;  
CREATE PROCEDURE foo(x INT, y INT)  
BEGIN  
  DECLARE bla INT;  
END  

Syntaktisch müsste der Code doch in Ordnung sein?!

Fehlermeldung:
ERROR 1064 (42000) at line 3: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INT' at line 3

Über phpmyadmin selbiges.

solche Fehlermeldungen bekomme ich seltsamerweise auch nur dann wenn ich Files importiere in denen stored procedures deklariert sind.

Mach ich irgendwas falsch?

phpinfo():
PHP Version 5.1.6-pl6-gentoo
mysql 5.1.14-beta

  1. Moin!

    solche Fehlermeldungen bekomme ich seltsamerweise auch nur dann wenn ich Files importiere in denen stored procedures deklariert sind.

    Mach ich irgendwas falsch?

    PHPMyAdmin macht was falsch. Kann in älteren Versionen mit Stored Procedures nicht umgehen - und ab welcher aktuellen Version, habe ich nicht nachgesehen. Check das selbst mal.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Hi,

      PHPMyAdmin macht was falsch. Kann in älteren Versionen mit Stored Procedures nicht umgehen - und ab welcher aktuellen Version, habe ich nicht nachgesehen. Check das selbst mal.

      phpMyAdmin-Verison 2.9.2-rc1, published: 2007-01-09. Ist jetzt nicht die Neuste, aber Probleme bgzl. stored procedures sind mir soweit nicht bekannt. Auch in google habe ich dies bzgl. nichts gefunden.
      Ansonsten entsteht das Probleme ja auch wenn ich die Files über den MySQL-Client(5.1.14-beta) importiere. Also an meiner Vorgehensweise und am Code ist nichts falsch?

  2. use database;
    DROP PROCEDURE IF EXISTS foo;
    CREATE PROCEDURE foo(x INT, y INT)
    BEGIN
      DECLARE bla INT;
    END

    
    > Syntaktisch müsste der Code doch in Ordnung sein?!  
      
    Hast Du diesen Code abgesandt oder ist das nur eine Skizze? "use database" sieht merkwürdig aus.
    
    1. use database;
      DROP PROCEDURE IF EXISTS foo;
      CREATE PROCEDURE foo(x INT, y INT)
      BEGIN
        DECLARE bla INT;
      END

      
      > > Syntaktisch müsste der Code doch in Ordnung sein?!  
      >   
      > Hast Du diesen Code abgesandt oder ist das nur eine Skizze? "use database" sieht merkwürdig aus.  
        
      Das "Create Procedure" ebenfalls - <http://dev.mysql.com/doc/refman/5.1/de/create-procedure.html>  
        
      Ist das "declare" OK?   ;)
      
      1. Hast Du diesen Code abgesandt oder ist das nur eine Skizze? "use database" sieht merkwürdig aus.

        Das "Create Procedure" ebenfalls - http://dev.mysql.com/doc/refman/5.1/de/create-procedure.html

        Ist das "declare" OK?   ;)

        use database; ist nur ein beispiel.
        Ich kann keinen syntaktischen Fehler an meinem beispiel erkennen. Das DECLARE-Statement sollte auch in Ordnung sein, aber ich kann mich gern eines bessere belehren lassen ;)

        1. use database; ist nur ein beispiel.

          Warum kommt nicht das was den Fehler auslöst, sondern ein "Beispiel"?

          Ich kann keinen syntaktischen Fehler an meinem beispiel erkennen. Das DECLARE-Statement sollte auch in Ordnung sein, aber ich kann mich gern eines bessere belehren lassen ;)

          SPs ohne Rückgabewerte OK?

          1. use database; ist nur ein beispiel.

            Warum kommt nicht das was den Fehler auslöst, sondern ein "Beispiel"?

            das "use database;" dient nur der Vollständigkeit, denks dir einfach weg.

            Ich kann keinen syntaktischen Fehler an meinem beispiel erkennen. Das DECLARE-Statement sollte auch in Ordnung sein, aber ich kann mich gern eines bessere belehren lassen ;)

            SPs ohne Rückgabewerte OK?

            ja! Eine SP braucht nicht zwingend einen Rückgabewert, genauso kann die Parameterliste auch leer sein.

            hier gerne noch mal ein beispiel:

              
            use bahn24;  
            DROP PROCEDURE IF EXISTS foo;  
            CREATE PROCEDURE foo(x INT, y INT, OUT res INT)  
            BEGIN  
              DECLARE bla INT;  
              SET bla = 4711;  
              SET res = bla;  
            END  
            
            

            Fehlermeldung:
            ERROR 1064 (42000) at line 3: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INT' at line 3

            1. use bahn24;
              DROP PROCEDURE IF EXISTS foo;
              CREATE PROCEDURE foo(x INT, y INT, OUT res INT)
              BEGIN
                DECLARE bla INT;
                SET bla = 4711;
                SET res = bla;
              END

                
              Du wirst es vielleicht schon geahnt haben, dass MySQL nur am Rande unsere Bemühungen berührt, aber was soll das Semikolon? Ist doch ziemlich unccol, in einem Stapel als "Go!" könnten wirs verstehen, aber hier? Und wenn, nun fehlt dann vielleicht hinter END ein Semikolon?  
                
              Weiteres in der "englischen" Doku: <http://dev.mysql.com/doc/refman/5.1/en/stored-procedures.html>
              
              1. Ach so, SPs sind ein relativ neues feature und stehen in der von Dir nicht genannten Version von MySQL möglicherweise nicht z.V..

                1. Ach so, SPs sind ein relativ neues feature und stehen in der von Dir nicht genannten Version von MySQL möglicherweise nicht z.V..

                  ähm, ich kann gerne NOCHMAL meine Versionen posten:
                  phpMyAdmin - 2.9.2-rc1
                  MySQL-Client-Version: 5.1.14-beta
                  siehe erstes Posting!

                  und ja, meine SQL-Version unterstützt SP.

                  1. MySQL-Client-Version: 5.1.14-beta

                    Als alter MS SQL Serverler würden wir eher eine Server Versionsangabe erwarten, aber OK, wenns sowas bei MySQL nicht gibt.   ;)

                    und ja, meine SQL-Version unterstützt SP.

                    Frage: Irgendeine SP zum Laufen bekommen? Irgendetwas per MySQL-Client-Version: 5.1.14-beta ausführen können? Problem schon bestmöglich isoliert? (Fehlercode muss doch vom Datenserver kommen, insofern kanns doch nicht am QueryTool liegen, oder?)

                    1. Frage: Irgendeine SP zum Laufen bekommen? Irgendetwas per MySQL-Client-Version: 5.1.14-beta ausführen können? Problem schon bestmöglich isoliert? (Fehlercode muss doch vom Datenserver kommen, insofern kanns doch nicht am QueryTool liegen, oder?)

                      jap, ne SP ohne routine_body lässt sich zumindest ohne Fehlermeldungen anlegen. Ich hab schon alles möglich ausprobiert, mehrere Stunden dran gesehen und mittlerweile bin ich am verzweifeln... mir gehn die Ideen aus.

              2. Du wirst es vielleicht schon geahnt haben, dass MySQL nur am Rande unsere Bemühungen berührt, aber was soll das Semikolon? Ist doch ziemlich unccol, in einem Stapel als "Go!" könnten wirs verstehen, aber hier? Und wenn, nun fehlt dann vielleicht hinter END ein Semikolon?

                wie meinen?
                Irgendwie werd ich das Gefühl nicht los, dass du mit SP unter MySQL noch nicht gearbeitet hast. Die Semikolon sind laut Doku ALLE an der richtigen Stelle!

                1. Du wirst es vielleicht schon geahnt haben, dass MySQL nur am Rande unsere Bemühungen berührt, aber was soll das Semikolon? Ist doch ziemlich unccol, in einem Stapel als "Go!" könnten wirs verstehen, aber hier? Und wenn, nun fehlt dann vielleicht hinter END ein Semikolon?

                  wie meinen?

                  Jetzt aber nicht undankbar werden. Freue Dich doch das ein Mitmensch bei dieser Trivialproblembehandlung, dessen Zielobjekt zudem unzureichend isoliert ist, mitkämpft.

                  Die Semikolon sind laut Doku ALLE an der richtigen Stelle!

                  Was ist ein Semikolon hier? Ein Anweisungsbegrenzer. Andere SQL-Dialekte kennen stattdessen den ZVS/WRL. Sind Semikolons unter MySQL erforderlich? (Zudem kommen einige Programmbeispiele kommen mit einem Semikolon nach dem END.)

                  Zudem haben nach unserer Kenntnis einige Tools bzw. Module Probleme mit dem Simikolon. Darum der gutgemeinte Tipp unsererseits.

                  1. Die Semikolon sind laut Doku ALLE an der richtigen Stelle!

                    Was ist ein Semikolon hier? Ein Anweisungsbegrenzer. Andere SQL-Dialekte kennen stattdessen den ZVS/WRL. Sind Semikolons unter MySQL erforderlich? (Zudem kommen einige Programmbeispiele kommen mit einem Semikolon nach dem END.)

                    Zudem haben nach unserer Kenntnis einige Tools bzw. Module Probleme mit dem Simikolon. Darum der gutgemeinte Tipp unsererseits.

                    wie im ersten posting schon erwähnt, habe ich dieses problem nur bei SP. in sql-files in denen einfach nur datenbanken und tabellen angelegt werden treten diese probleme nicht auf, und dort sind auch jede menge semikolon vorhanden. am delimiter liegt es nicht!

                    so trivial scheint es nicht zu sein wie du es so schön erwähnt hast. ansonsten hätte mir bestimmt ein erfahrener mysql-programmieren mir auf anhiep sagen können, woran es liegt.

  3. ich sollte vielleicht noch hinzufügen, das ich nur probleme beim importieren von sql-files habe. wenn ich eine SP manuell im MySQl-Client eingebe, funzt alles einwandfrei.

    1. ich sollte vielleicht noch hinzufügen, das ich nur probleme beim importieren von sql-files habe. wenn ich eine SP manuell im MySQl-Client eingebe, funzt alles einwandfrei.

      Rechteprobleme sind ausgeschlossen?

      1. ich sollte vielleicht noch hinzufügen, das ich nur probleme beim importieren von sql-files habe. wenn ich eine SP manuell im MySQl-Client eingebe, funzt alles einwandfrei.

        Rechteprobleme sind ausgeschlossen?

        das würde er mir sagen oder?
        ansonsten kann ich files(wie ich auch schon erwähnt habe) die kein SPs enthalten ohne probleme importieren.

        1. Rechteprobleme sind ausgeschlossen?
          das würde er mir sagen oder?

          LOL - vielleicht. Ist der Sicherheitskontext derselbe oder nicht? Kann es sein, dass Du einmal mit einem lokalen Account kommst, einmal mit dem datenserver-Dienstkonto? Auf jeden Fall prüfen.

          ansonsten kann ich files(wie ich auch schon erwähnt habe) die kein SPs enthalten ohne probleme importieren.

          Nun, es gibt normalerweise schon Rechte fürs EXEC oder CREATE von SPs, sind ja oft heisse Eisen.

          1. Rechteprobleme sind ausgeschlossen?
            das würde er mir sagen oder?

            LOL - vielleicht. Ist der Sicherheitskontext derselbe oder nicht? Kann es sein, dass Du einmal mit einem lokalen Account kommst, einmal mit dem datenserver-Dienstkonto? Auf jeden Fall prüfen.

            ansonsten kann ich files(wie ich auch schon erwähnt habe) die kein SPs enthalten ohne probleme importieren.

            Nun, es gibt normalerweise schon Rechte fürs EXEC oder CREATE von SPs, sind ja oft heisse Eisen.

            tut mir leid das ich mich nicht auf deinem wissensstand befinde, wenn dem so wäre würde ich hier meine frage nicht stellen. ich habe keine ahnung von dem was du da eben beschrieben hast, keine ahnung wie ich das prüfen kann.

            1. "ich sollte vielleicht noch hinzufügen, das ich nur probleme beim importieren von sql-files habe. wenn ich eine SP manuell im MySQl-Client eingebe, funzt alles einwandfrei."

              Irgendwie mal den User_Name ausgeben lassen mit dem Du die Ausführung von Code in beiden Varianten in Auftrag gibst.

              Eventuell auch mal hier einlesen (wir machens nicht, keine Zeit ;):
              http://dev.mysql.com/doc/refman/5.1/de/privileges.html

              1. Irgendwie mal den User_Name ausgeben lassen mit dem Du die Ausführung von Code in beiden Varianten in Auftrag gibst.

                root> mysql -u root -p
                1. frage: welcher user wird das wohl sein?
                2. frage: hab ich das nicht in meinem ersten posting erwähnt?

                Eventuell auch mal hier einlesen (wir machens nicht, keine Zeit ;):
                http://dev.mysql.com/doc/refman/5.1/de/privileges.html

                irrelavant für mein problem!

    2. echo $begrüßung;

      ich sollte vielleicht noch hinzufügen, das ich nur probleme beim importieren von sql-files habe. wenn ich eine SP manuell im MySQl-Client eingebe, funzt alles einwandfrei.

      Genauer gesagt - wie ich annehme - beim Importieren mit dem phpMyAdmin. Da gibt es in der Tat Probleme, weil der so wie es aussieht, und wie es Sven schon gesagt hat, mit SP nicht umgehen kann. Dem auf der Fehlerseite zitierten Statement fehlt das abschließende END.

      Gib doch mal am Kommandozeilen-Client ein

      delimiter //
        CREATE PROCEDURE foo(x INT, y INT)
        BEGIN DECLARE bla INT;//

      Hier fehlt auch das END und du wirst die gleiche Meldung bekommen, die der phpMyAdmin ausgibt.

      Da es in PHP mit den allgemeine üblichen Query-Funktionen nicht möglich ist, mehrere Stamements auf einmal abzusenden *), trennt der phpMyAdmin mehrere Statements am Semikolon auf und sendet sie einzeln. Diesem Vorgehen fällt nun augenscheinlich die SP zum Opfer.

      *) mysqli_multi_query() kann das, aber das verwendet der phpMyAdmin nicht.

      echo "$verabschiedung $name";

      1. Hi,

        Genauer gesagt - wie ich annehme - beim Importieren mit dem phpMyAdmin. Da gibt es in der Tat Probleme, weil der so wie es aussieht, und wie es Sven schon gesagt hat, mit SP nicht umgehen kann. Dem auf der Fehlerseite zitierten Statement fehlt das abschließende END.

        auch beim importieren über den mysql-client...
        habs aber mittlerweile hinbekommen, ich sende die sql-skripte über toad, und siehe da, es funktioniert!

  4. @king^lully
    danke für deine irreführende problemlösungen, die nun rein gar nichts mit zu tun gehabt haben. aber ich denke du wolltest auch nur helfen :) nimms bitte nicht persönlich, bist bestimmt en intelligenter bub aber mit stored procedures unter mysql hast du meines erachtens keine erfahrungen, wodurch ich stark in die irre geführt wurde und es mich viel zeit gekostet hat! ich weiß nicht wieso -ist mir auch mittlerweile egal- funzt alles wunderbar über den import von toad.

    1. @king^lully
      danke für deine irreführende problemlösungen, die nun rein gar nichts mit zu tun gehabt haben.

      Gerne geschehen, man ist halt doof geboren und versucht jeden Tag ein klein wenig hinzu zu lernen. Wenns diesmal auf Deine Kosten geschehen ist, so bedauern wir das sehr, so zu sagen auf das Äusserste.

      aber ich denke du wolltest auch nur helfen :) nimms bitte nicht persönlich, bist bestimmt en intelligenter bub aber mit stored procedures unter mysql hast du meines erachtens keine erfahrungen,

      Wie bereits mehrfach angedeutet, haben wir mit MySQL wenig Erfahrung.

      wodurch ich stark in die irre geführt wurde und es mich viel zeit gekostet hat!

      Da können wir wirklich nur noch hoffen, dass unsere Entschuldigung für eigene Fehlleistungen der letzten Tage - gerade auch als Berater in diesem Beitragsstrang - nicht zu spät gekommen ist.

      ich weiß nicht wieso -ist mir auch mittlerweile egal- funzt alles wunderbar über den import von toad.

      Also, nur noch mal als Wink mit dem Zaunpfählchen, es ist wohl so wie von Sven R. sehr früh bzw. von Dödlfix als Letztem bzw. von uns angedeutet: PHPMyAdmin in der von Dir genannten Version behandelt das ";" (Semikolon) falsch (bzw. "richtig" (also auf beabsichtigte Art und Weise) aus seiner Sicht mit der Folge, dass SPs bröckchenweise und somit für den Datenserver unverständlich versandt worden sind).

      Alles Gute bei der zukünftigen Entwicklung!