Stefano Albrecht: SQL: dbms-spezifisch?

Hallo liebes Forum ;~)

Sind die folgenden SQL-Klauseln MySQL-spezifisch?

show databases;
show tables;

Habe leider keine Möglichkeit, dies auf anderen DBMS zu testen.

Und wenn diese spezifisch sind:
Wandelt ODBC die Klauseln in die jeweiligen DBMS-Equivalente um?

Vielen Dank.

Freundliche Grüße
Stefano Albrecht

  1. Hi,

    Sind die folgenden SQL-Klauseln MySQL-spezifisch?

    ja.

    Wandelt ODBC die Klauseln in die jeweiligen DBMS-Equivalente um?

    Unwahrscheinlich. Bei dem einen DBMS sind es Spezialfunktionen, bei dem anderen mehr oder minder komplexe Selects auf Systemtabellen, ggf. auch versionsabhängig. Was ist der Hintergrund Deiner Frage?

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Eines meiner Programme prüft in einer kurzen Schleife, ob eine Datenbank bzw. eine Tabelle verfügbar ist. Zu diesem Zweck habe ich die beiden angesprochenen Klauseln verwendet. Da ich momentan den MyODBC-Treiber verwende, habe ich keine Probleme damit, aber das Programm findet vermutlich bald Anwendung auf Oracle und Sybase.

      Hat ODBC Funktionen, die das übernehmen?

      Vielen Dank.

      Freundliche Grüße
      Stefano Albrecht

      1. Hi,

        Eines meiner Programme prüft in einer kurzen Schleife, ob eine Datenbank bzw. eine Tabelle verfügbar ist.

        ups. Klingt nach einem gravierenden Konzeptfehler von epischen Ausmaßen. Warum?

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Klingt nach einem gravierenden Konzeptfehler von epischen Ausmaßen.

          Halb so schlimm ;~)
          Aber der Satz hat sich wunderschön angehört.

          Mein Programm ließt Parameter für eine Verbindung aus einer Klartextdatei aus, darunter den Datenbanknamen. Während der Laufzeit prüft es nun, ob diese Datenbank vorhanden ist, und wenn nicht, erstellt es diese. Dasselbe tut es mit der Tabelle. Ich möchte nicht plump einfach die Datenbank bzw. die Tabelle erstellen (oder mit "select" ansprechen), und abwarten, ob mir ein Fehlercode sagt, dass diese schon vorhanden sind (bzw. nicht vorhanden sind). Daher diese "elegante" Variante mit "show databases;" usw.

          Obwohl: Die "plumpe" Variante verlangt weniger Zeit und würde das Programm nicht abbrechen. Trotzdem ;~)

          Kennst Du vielleicht eine Alternative?

          Vielen Dank für Deine Anteilname.

          Freundliche Grüße
          Stefano Albrecht

          1. Halb so schlimm ;~)

            Um genauer zu sein:

            Das Programm ist nicht da, um vorhandene Systeme auszuweiten bzw. zu aktualisieren. Es findet nur auf vielen unterschiedlichen, und vor allem unpreparierten System Verwendung, auf denen es sich dann ohne User-Zugabe seine Arbeitsumgebung schaffen soll.

            Freundliche Grüße
            Stefano Albrecht

          2. Hallo Freunde des gehobenen Forumsgenusses,

            Während der Laufzeit prüft es nun, ob diese Datenbank vorhanden ist, und wenn nicht, erstellt es diese. Dasselbe tut es mit der Tabelle.

            Das geht noch viel eleganter:
            create database if not exists datenbank;
            create table if not exists tabelle();

            Gruß
            Alexander Brock

            --
            [latex]\lim_{3 \to 4}{\sqrt{3}} = 2[/latex]
            1. Hallo Alexander ;~)

              Und das ist kein Zusatz von MySQL?
              Das wäre ja fantastisch!!

              Vielen Dank.

              Freundliche Grüße
              Stefano Albrecht

      2. Hi,

        wie Cheatah schon richtig sagte, da unterscheiden sich die einzelnen DBMS ziemlich. Wenn du eine vordefinierte Struktur abprüfen möchtest rate ich daher zu einem direkten SELECT auf die Tabelle mit den erwarteten Spalten. Wenn das ohne Fehler durchläuft, scheint da zunächst mal alles in Ordnung zu sein.

        MfG
        Rouven

        --
        -------------------
        ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
        1. Hallo Rouven,

          ja, das habe ich auch schon in Betracht gezogen, doch das scheint mir sehr unelegant, daher möchte ich das gerne auf eine etwas andere Weise lösen können.

          Kennst Du eine Alternative?

          Vielen Dank.

          Freundliche Grüße
          Stefano Albrecht

          1. Hi,

            na ja, eine Alternative wäre Schichtenarchitektur. Sei es objektorientiert oder über ein Include, du führst für jedes DBMS eine eigene Zugriffsmethode ein. In der MySQL-Check-Funktion lässt du dann das showtables laufen, in einer DB2 Variante machst du ein SELECT ... FROM SYSIBM.SYSTABLES usw.

            MfG
            Rouven

            --
            -------------------
            ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
            1. Hallo,

              na ja, eine Alternative wäre Schichtenarchitektur. Sei es objektorientiert oder über ein Include, du führst für jedes DBMS eine eigene Zugriffsmethode ein. In der MySQL-Check-Funktion lässt du dann das showtables laufen, in einer DB2 Variante machst du ein SELECT ... FROM SYSIBM.SYSTABLES usw.

              Da sich dann auch noch die Frage stellt, ob alle anderen, von dem Programm verwendeten, SQL-Statements nicht doch auch mySQL-spezifische Elemente enthalten, halte ich die Kapselung der Datenabnkzugriffe in DBMS-spezifische 'Module' sowieso für sinnvoll.

              Grüße
                Klaus

              1. mal eine andere frage:

                ist

                create database <<<;

                und

                create table xxx (xxx);

                auch mysql???

                gruß simon

                1. Hallo Simon ;~)

                  Nein, kein MySQL.
                  Die Klauseln gehören zu DDL (Data Define Language).
                  DDL ist eine Gruppe von SQL-Anweisungen.

                  Freundliche Grüße
                  Stefano Albrecht

                2. Hallo,

                  mal eine andere frage:
                  ist
                  create database <<<;
                  und
                  create table xxx (xxx);

                  auch mysql???

                  An sich nicht, aber es könnten DBMS-spezifische Erweiterungen existieren. Beispielsweise gibt es Unterschiede bei den zur Verfügung stehenden Datentypen und Funktionen, die es notwendig machen, dass man als Progammierer bzw. Datenbankdesigner entsprechende 'Weichen' einbaut.
                  Sieh' Dir beispielsweise die Unterschiede von CREATE DATABASE in mySQL,  Firebird/Interbase
                  oder auch  Oracle an.

                  Selbst wenn Du da nur mit den jeweiligen Minimal-Versionen arbeitest, ergeben sich automatisch Unterschiede in der Syntax, ganz zu schwiegen in den daraus resultierenden Ergebnissen.

                  Grüße
                    Klaus

                  1. Hi,

                    ach ja, stimmt, genau, versuch z.B. mal in einer DB2 einen AutoIncrement zu finden. Der letzte Vorschlag, den ich vor einiger Zeit im Handbuch ausgegraben habe war ein TRIGGER, der den maximalen Wert ausliest und eins draufrechnet.

                    MfG
                    Rouven

                    --
                    -------------------
                    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
                    1. echo $begrüßung;

                      ach ja, stimmt, genau, versuch z.B. mal in einer DB2 einen AutoIncrement zu finden. Der letzte Vorschlag, den ich vor einiger Zeit im Handbuch ausgegraben habe war ein TRIGGER, der den maximalen Wert ausliest und eins draufrechnet.

                      Unter Oracle kann man zum Hochzählen Sequencen verwenden. Ein Trigger fragt den Wert der Sequence ab, der dabei automatisch erhöht wird, und trägt ihn im Datensatz ein.

                      Vielleicht gibts das ja auch in DB2?

                      echo "$verabschiedung $name";

      3. Hat ODBC Funktionen, die das übernehmen?

        Ja, und diese habe ich jetzt gefunden:

        sqlTables

        Freundliche Grüße
        Stefano Albrecht