SQLquery

Top  Previous  Next

 

Mit diesem Befehl lassen sich Datenbankabfragen sowie Eingaben über bestehende ODBC-Verbindungen durchführen.

Voraussetzung

Unter Windows muß eine ODBC-Verbindung eingerichtet sein und Moskito muß mit selbiger verbunden sein (mit dem Befehl SQLconnect oder über den Dialog im Menü Verwalten-Datenbank).

Parameter

<DATABASE>

Dieser erste nichtoptionale Parameter gibt den Namen (Alias) der ODBS-Datenquelle an.

<QUERY>

Dieser zweite nichtoptionale Parameter ist die reguläre SQL-Abfrage oder der Abfrageausdruck, der - in Kommata gefaßt - als ein String und einzelner Parameter aufgefaßt wird. Der Abfrageausdruck beginnt jeweils mit der SQL-Anweisung wie z.B. DELETE, INSERT, SELECT oder UPDATE.

Neben den standardisierten SQL-Abfragen gibt es einige fest einprogrammierte Abfrageausdrücke. Dazu zählen:

"Describe Tables"

"Describe Columns <Spaltenname>"

DIALOG

Die Abfragewerte werden in einen Dialog gefüllt. Nummer und Feld(er) des Dialogs müssen die nächsten Parameter sein.

<dialognr>

Die Abfragewerte werden in den Dialog mit der Nummer <dialognr> geschrieben.

<feldnr>

Die Abfragewerte werden im o.a. Dialog in das Feld mit der Nummer <feldnr> geschrieben. Es können mehrere Felder angegeben werden.

/VERBOSE

Mehr Ausgaben erzeugen.

/SILENT

Weniger Ausgaben erzeugen.

/NULL

Bei Nullwerten in den Tabellenspalten antatt eines Leerstrings "<NULL>" ausgeben.

/NOQUOTE

Mit diesem optionalen Schalter werden die Werte ohne Anführungszeichen zurückgegeben. Dieser Parameter kann auch /NOQ abgekürzt werden.

/TABLE

Mehrzeilige Verarbeitung wie in MultiExec (siehe Beispiel unten).

/COLNAMES

Nur in Verbindung mit "SELECT * FROM ..." Die Namen der Tabellenspalten als erste Zeile oder als Spaltenüberschrift im Listview ausgeben.

ROWS/<Wert1>{-<Wert2>}

Mit diesem optionalen Schalter wird angegeben welcher Datensatz (Wert1) bzw. welcher Datensatzbereich (Wert1 bis Wert2) ausgegeben wird.

/NAMES

(Nur in Verbindung mit ROWS) Liefert die Namen der Spalten als erste Zeile.

/TYPES

(Nur in Verbindung mit ROWS) Liefert die Datentypen der Spalten als erste, in Verbindung mit /NAMES als zweite Spalte.

/EER2

Liefert -1 als Rückgabewert, wenn ein Fehler aufgetreten ist.

/H

Mit diesem Schalter wird ein Hilfetext und die Aufrufkonvention angezeigt.

Rückgabewert

Der Rückgabewert ist abhängig vom Parameter QUERY, dem Abfrageausdruck. Beginnt er mit der SQL-Anweisung SELECT, so werden die selektierten Abfragewerte zurückgegeben. Ansonsten wird kein Wert zurückgegeben. Mißlingt eine SQL-Anweisung z.B. aufgrund eines fehlerhaften Abfrageausdrucks, so wird die Fehlermeldung des ODBC-Treibers ausgegeben.

Beispiel

 

Im folgenden sind Beispiele für ABFRAGEN, EINFÜGEN, UPDATEN, LÖSCHEN, EINRICHTEN und für komplexere Verwendungen aufgeführt.

Angenommen es existiert eine ODBC-Datenbank-Verbindung mit dem Namen TESTDATENBANK, oder die TESTDATENBANK ist „direkt“ mit Moskito verbunden (durch SQLconnect oder über das Menü Verwalten | Datenbank | > Button „Neue Verbidnung“ ).

In dieser Datenbank gibt es eine Tabelle mit dem Namen TEST und folgendem Inhalt:

Name

Zahl

Attribut

Karl-Heinz

1

Blau

Kurt

2

Grün

 

ABFRAGEN:

„Select“ - liefert Werte aus einer oder mehreren Spalten, entweder alle Werte, oder nur die welche einem oder mehreren Kriterien entsprechen („where“ und „and“)

SQLquery(TESTDATENBANK "select Name from Test where Zahl=1")

-> "Karl-Heinz"

Die Funktion gibt den Wert "Karl-Heinz" zurück.

SQLquery(TESTDATENBANK "select Name from Test where Zahl=1" /noq)

-> Karl-Heinz

Mit dem optionalen Parameter /NOQ gibt die Funktion den Wert Karl-Heinz ohne Anführungszeichen zurück.

 

EINFÜGEN:

Der Befehl INSERT fügt einen neuen Datensatz in eine Tabelle ein.

SQLquery(TESTDATENBANK "insert into Test(Name,Zahl,Attribut) Values('Fritz',3,'grau')")

 

Name

Zahl

Attribut

Karl-Heinz

1

blau

Kurt

2

grün

Fritz

3

grau

Strings müssen dabei in einfache Hochkommata eingeschlossen übergeben werden, Datumsangaben werden entweder in der Form #YYYY-MM-DD HH-MM-SS# in Doppelkreuze eingefaßt oder im Standarddatumsformat 'DD-MON-YY' (in Hochkommata eingefaßt) übergeben.

 

UPDATEN:

Der Befehl „Update“ ändert die bestehende Tabelle wie folgt:

SQLquery(TESTDATENBANK "update Test set Name='Fritzchen', Attribut='graublau' where Zahl=3")

 

Name

Zahl

Attribut

Karl-Heinz

1

blau

Kurt

2

grün

Fritzchen

3

graublau

Achtung: Fehlt die WHERE-Bedingung in diesem Ausdruck, so werden alle Zeilen der Tabelle verändert.

LÖSCHEN:

Die SQL-Anweisung DELETE löscht komplette Datensätze:

SQLquery(TESTDATENBANK "delete from Test where Name='Fritzchen'")

 

Name

Zahl

Attribut

Karl-Heinz

1

blau

Kurt

2

grün

 

EINRICHTEN:

Aus Moskito heraus können Tabellen angelegt oder erweitert werden:

SQLquery ALBATROS "CREATE TABLE Abweichung "

Eine Spalte vom Typ Text anlegen:

SQLquery ALBATROS "ALTER TABLE VG_Fremd_Leitung ADD Betreiber TEXT"

Eine Spalte vom Typ Zahl anlegen:

SQLquery ALBATROS "ALTER TABLE VG_HD_Geraet ADD Gemeindeschluessel INTEGER"

Eine Spalte vom Typ Autowert anlegen:

SQLquery Siegburg "ALTER TABLE Hausnummern ADD Hochwert COUNTER "

Eine Spalte löschen

SQLquery Siegburg "ALTER TABLE Hausnummern DROP id TEXT "

komplexere Verwendung von SQLquery:

Nur einen Teil der Daten abfragen:

SQLquery(TESTDATENBANK "select * from Test" ROWS/1-10)

Einen Dialog mit dem Inhalt einer Tabelle füllen:

SQLquery(TESTDATENBANK DIALOG 100 100 "select * from Test")

Die Auswahlbox mit dem Inhalt einer Tabelle füllen:

Auswahl "Tabelle Test" "Name|Zahl|Attribut"

SQLquery(TESTDATENBANK DIALOG 165 108 "select * from Test")

Die Auswahlbox mit dem Inhalt einer Tabelle füllen und die Spalten automatisch erstellen

Auswahl "Tabelle Test"

SQLquery(TESTDATENBANK DIALOG 165 108 "select * from Test" /COLNAMES)

Mehrere Zeilen, z.B. aus einem DBquery verarbeiten

SQLquery dataglobal "insert into ref_tab (AttributInhalt,Elementname,Wert) Values ('%%s','%%s','%%s')" /TABLE "1 2 3" "3 4 5"

 

Bemerkung

Um den verschiedenen SQL-Dialekten gerecht zu werden, die z.B. Access-, SQLite- oder Oracle-Datenbanken voneinander unterscheiden, führt Moskito eine Syntaxüberprüfung durch und ersetzt ggf. Formulierungen durch solche, die der jew. Treiber erwartet.

Für den Anwender bedeutet das, daß er nicht wissen muß, auf welchem Datenbanksystem er arbeitet und sich auch nicht in die jeweiligen Feinheiten einarbeiten muß.

Übersicht über die Änderungen:

Datendefinition (CREATE TABLE, ALTER TABLE)

 

Oracle-Datentyp

wird zu

Hinweis

BFILE

LONGBINARY

 

BLOB

LONGBINARY

 

CHAR(zahl)

TEXT(zahl)

CHAR in Oracle erwartet genau die festgelegte Anzahl von Zeichen, Access erlaubt auch weniger. Datentypen mit genau festgelegter Zeichenzahl gibt es in Access nicht; eine genau bestimmte Anzahl von Zeichen wird dort über die Feldeigenschaften festgelegt

CLOB

MEMO

 

DATE

DATE

 

NCHAR(zahl)

TEXT(zahl)

 

NLOB

MEMO

 

NUMBER(Ganzzahl)

LONG

 

NUMBER(Kommazahl)

DOUBLE

 

RAW(zahl)

BINARY(zahl)

 

VARCHAR(zahl)

TEXT(zahl)

 

VARCHAR(zahl)

TEXT(zahl)

 

 

 

Access-Datentyp

wird zu

Hinweis

BINARY

RAW(255)

 

BINARY(zahl)

RAW(zahl)

 

BIT

NUMBER(1)

 

BYTE

NUMBER(3)

 

CHAR(zahl)

CHAR(zahl)

Obwohl CHAR in Access ein Feld mit variabler Zeichenzahl (bis zur Höchstgrenze) ist, wird es in Oracle als Feld mit genau festgelegter Zeichenzahl umgesetzt; Für Felder mit variabler Zeichenanzahl können TEXT und VARCHAR benutzt werden

DATE

DATE

 

DOUBLE

NUMBER(12,6)

 

LONG

NUMBER(12)

 

LONGBINARY

BLOB

 

LONGTEXT

CLOB

 

MEMO

CLOB

 

NUMBER

NUMBER(12)

 

SHORT

NUMBER(5)

 

SINGLE

NUMBER(10,6)

 

TEXT(zahl)

VARCHAR(zahl)

 

 

 

Syntaxunterschiede

Tabellenalias

Das Schlüsselwort AS vor einem Tabellenalias gibt es nicht im Oracle-SQL, es wird ersatzlos entfernt.

Bsp.: SELECT * FROM Anzahlen AS A

wird zu SELECT * FROM Anzahlen A

Umgekehrt kann das AS nicht eingefügt werden, weil diese Syntaxüberprüfung zu aufwändig wäre!

JOINS

Access kennt INNER, OUTER, LEFT und RIGHT JOIN’s, Oracle kennt nur ein globales JOIN, das dem INNER JOIN entspricht. Die Zusätze INNER, OUTER, LEFT und RIGHT werden entfernt, es können Ungleichheiten in den Views (Abfragen) entstehen. Umgekehrt werden Oracle-JOIN’s in INNER JOIN’s umgewandelt.

 

Siehe auch

DBquery

MultiExec