Matti Maekitalo: MySQL: Zeilenumbruch nach Semikolon

Hallo Forum,

ich mußte gerade feststellen, daß MySQL mit Zeilenumbrüchen nach einem Semikolon Probleme hat. Ich will dies an einem Beispielprogramm verdeutlichen
###################
#!/usr/bin/perl -w

use strict;
use DBI;
use Data::Dumper;

my $dbh = DBI->connect('dbi:mysql:database=xxxxx','','');
 my $sth = $dbh->prepare(<<"EOF");
 SELECT *
 FROM news;
EOF

$sth->execute;
 print "Fehlermeldung: " . $DBI::errstr if $DBI::errstr;
 my $data = $sth->fetchall_arrayref;
 print Dumper(@data);
 $sth->finish;
 $dbh->disconnect;

##########################

Fehlermeldung: You have an error in your SQL syntax near '; ' at line 2

Wenn ich das Semikolon entferne, geht es. Insgesamt ohne Semikolons am Ende zu schreiben halte ich zwar für möglich, allerdings nicht für elegant.

Warum tritt dieser Fehler auf, kann ich ihn irgendwie userseitig umgehen?

MySQL Version: 3.23.49-log
Darauf habe ich leider keinen Einfluß, ist Software meines Providers.

Tschö, Matti

  1. Hi,

    Wenn ich das Semikolon entferne, geht es. Insgesamt ohne Semikolons am Ende zu schreiben halte ich zwar für möglich, allerdings nicht für elegant.

    Einspruch. Das Semikolon ist genau dann nötig, wenn es ohne dies schwer wäre, das Ende des Statements zu erkennen. Dies ist hier jedoch, anders als auf einer Shell, nicht der Fall. Als DBMS würde ich das Semikolon an sich als fehlerhaft ansehen - die Shell hat es zu entfernen.

    Unelegant finde ich es hingegen, SQL-Statements "mitten in den Perl-Code" zu schreiben... ich brauchte einen Moment um zu begreifen, dass Dein Code syntaktisch korrekt ist.

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. use Mosche;

      Unelegant finde ich es hingegen, SQL-Statements "mitten in den Perl-Code" zu schreiben... ich brauchte einen Moment um zu begreifen, dass Dein Code syntaktisch korrekt ist.

      Für mich sieht diese Methode schöner aus, als einen String ohne here-Document zu benutzen, gerade wenn ich lange SQL Statements habe.

      my $sth = $dbh->prepare("SELECT t1.col1, t1.col2, t1.col3, t1.col4, t2.col1 FROM table1 t1, table2 t2 WHERE t1.id = t2.id ORDER BY t1.col1 DESC, t2.col2, LIMIT 15 OFFSET 40");

      finde ich häßlicher als

      my $sth = $dbh->prepare(<<EOF);
         SELECT t1.col1, t1.col2, t1.col3, t1.col4, t2.col1
         FROM table1 t1, table2 t2
         WHERE t1.id = t2.id
         ORDER BY t1.col1 DESC, t2.col2,
         LIMIT 15 OFFSET 40
      EOF

      Oder meinst du etwas ganz anderes. Wie schreibst du denn dein SQL in deinen Code?

      use Tschoe qw(Matti);

      --

        Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
      1. Hi,

        Für mich sieht diese Methode schöner aus, als einen String ohne here-Document zu benutzen, gerade wenn ich lange SQL Statements habe.

        klar ist das auch Geschmackssache. Die Wartbarkeit leidet unter Deiner Methode jedoch.

        my $sth = $dbh->prepare(<<EOF);
           [...]
        EOF

        my $sth = $dbh->prepare("
           [...]
        "); # im Notfall

        Oder meinst du etwas ganz anderes.

        Nö, genau das.

        Wie schreibst du denn dein SQL in deinen Code?

        Meistens gekapselt, weniger mitten drin. In der Regel aber als Strings - nicht zuletzt wegen Highlighting im Editor.

        Cheatah

        --
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
      2. Moin Moin !

        Wenn ich mich mal anschließen darf:

        Das Semikolon mögen Oracle und MSSQL auch nicht gerne, es gehört da schlicht nicht hin. Aber das nur am Rande.

        Zum Thema SQL-inline in Perl:

        my $sth=$db->prepare(q{
            SELECT
              foo,bar,baz
            FROM
              grumble
            WHERE
              foo<5
            ORDER BY
              bar
        });

        oder

        my $sth=$db->prepare(<<'__magic__');
            SELECT
              foo,bar,baz
            FROM
              grumble
            WHERE
              foo<5
            ORDER BY
              bar
        __magic__

        Variante:

        my $cmd=<<'__magic__';
            SELECT
              foo,bar,baz
            FROM
              grumble
            WHERE
              foo<5
            ORDER BY
              bar
        __magic__

        my $sth=$db->prepare($cmd);

        Ich finde here-Scripts eigentlich ganz elegant, nur mag ich es überhaupt nicht, wenn man ein "stinknormales Wort" (/[1]+$/) als Abgrenzung nutzt. Ich hab das lieber etwas deutlicher, deswegen die vielen Unterstriche. Und ich schalte die Interpolation am liebsten mit nicht interpolierenden Single Quotes aus.

        Alexander

        --
        Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
        Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"

        1. A-Za-z ↩︎

      3. Hi Matti,

        my $sth = $dbh->prepare(<<EOF);
           SELECT t1.col1, t1.col2, t1.col3, t1.col4, t2.col1
           FROM table1 t1, table2 t2
           WHERE t1.id = t2.id
           ORDER BY t1.col1 DESC, t2.col2,
           LIMIT 15 OFFSET 40
        EOF
        Wie schreibst du denn dein SQL in deinen Code?

        (dieses Posting bitte mit nichtproportionalem Zeichensatz lesen ...)

        ich würde diese Anweisung ungefähr so notieren (bei den Zeilenumbrüchen bin ich mir nicht sicher, ich habe selten sooo komplexe Statements ... )

        my $sql_statement =    'SELECT t1.col1'
                          .         ', t1.col2'
                          .         ', t1.col3'
                          .         ', t1.col4'
                          .         ', t2.col1'
                          .     ' FROM table1 t1'
                          .         ', table2 t2'
                          .    ' WHERE t1.id = t2.id'
                          . ' ORDER BY t1.col1 DESC'
                          .         ', t2.col2'
                          .    ' LIMIT 15'
                          .   ' OFFSET 40'
                          .        ';'
                          ;
        my $sql_handle    = $dbh->prepare($sql_statement);

        Meine Zielsetzung:
        a) Ich will möglichst einfach einzelne Zeilen auskommentieren dürfen, ohne irgendwas sonst
           ändern zu müssen (in der "Probierphase" des SQL-Statements hilft das manchmal sehr).
        b) Ich will eine gemeinsame Spalte zwischen Schlüsselworten und Operandenlisten haben,
           weil sich mein Auge daran zu orientieren gewöhnt hat.
        c) Ich könnte rechts neben jede Zeile einen Kommentar schreiben (z. B. warum ich dieses Feld
           brauche oder in welcher Version sich das inkompatibel geändert hat usw.). 4GL-Code ist viel
           dokumentationsbedürftiger als 3GL-Code, finde ich, weil man sich der tatsächlichen Effekte
           viel weniger bewußt ist (denn die hat man ja dem Code-Generator überlassen).
        d) HERE-Dokumente verwende ich grundsätzlich nicht, weil diese meine Einrückungstechnik
           unterlaufen - und die ist mir sehr wichtig beim schnellen Erfassen der Code-Ablaufstruktur.

        Ästhetische Aspekte sind halt sehr subjektiv ... insbesondere ist es Geschmackssache, ob das Leerzeichen ans Ende oder an den Anfang einer Zeile gehört (vorne sehe ich besser, daß ich es nicht vergessen habe).

        Viele Grüße
              Michael

        P.S.: Das Semikolon bin ich so gewohnt, weil z. B. die mySQL-Kommandozeilen-Shnittstelle es verlangt und es hier nicht schadet.

        --
        T'Pol: I apologize if I acted inappropriately.
        V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
        (sh:| fo:} ch:] rl:( br:^ n4:( ie:% mo:) va:| de:/ zu:| fl:( ss:) ls:~ js:|)