[gelöst] SQL-Abfrage

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
MacWomble
Lazarusforum e. V.
Beiträge: 977
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 19.3 Cinnamon / FPC/Lazarus
CPU-Target: Intel i7 64/32 Bit
Wohnort: Freiburg

[gelöst] SQL-Abfrage

Beitrag von MacWomble »

Keine Ahnung, ob jemand von euch das beantworten kann, aber ein Versuch ist es wert:

Ich habe eine StoredProcedure, welche genau das macht was sie soll:

Code: Alles auswählen

CREATE DEFINER=`root`@`localhost` PROCEDURE `Getfields`()
BEGIN
  CREATE TEMPORARY TABLE t1 (SELECT * FROM Adressen LEFT JOIN AdressArten ON idadressart=fk_adressart);
  DESCRIBE t1;
  DROP TABLE t1;
END


Nun hätte ich gerne den Select-Befehl (in Klammern) durch eine Variable ersetzt, um beliebige Select-abfragen senden zu können:


Code: Alles auswählen

CREATE DEFINER=`root`@`localhost` PROCEDURE `Getfields`(IN @Abfrage varchar(500))
BEGIN
  CREATE TEMPORARY TABLE t1 (@Abfrage);
  DESCRIBE t1;
  DROP TABLE t1;
END


Das funktioniert so aber nicht. :(

Eventuell gibt es auch noch eine andere Lösung, für das was ich möchte. Ich habe allerdings nichts gefunden.
Ziel ist es, die Felddefinitionen aller Felder einer Abfrage!!! (nicht Table, das geht mit DESCRIBE) zu erhalten.
Zuletzt geändert von MacWomble am Mo 6. Apr 2020, 23:08, insgesamt 1-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4282
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: SQL-Abfrage

Beitrag von af0815 »

Welches DB-System (ev. auch Version)? Nach MS-SQL Server sieht das nicht unbedingt aus. Und gerade bei den SP unterscheiden sich die Systeme gewaltig und sind nicht kompatibel.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MacWomble
Lazarusforum e. V.
Beiträge: 977
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 19.3 Cinnamon / FPC/Lazarus
CPU-Target: Intel i7 64/32 Bit
Wohnort: Freiburg

Re: SQL-Abfrage

Beitrag von MacWomble »

Sorry, habe ich total vergessen: MySQL bzw. MariaDB
Mit MS-SQL habe ich nichts am Hut ;-)
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 4282
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: SQL-Abfrage

Beitrag von af0815 »

Das wird vermutlich auch nicht kompiliert werden. Die SP-Statements werden normalerweise vorkompiliert (Prepared) und Variablen dann ur mehr in den vorkompilerten Teil eingesetzt. Das dient auch der Abwehr von Code-Injection.

Eventuell könnte das hier dir helfen : https://mariadb.com/kb/en/execute-immediate/

BTW: MS-SQL läuft sehr stabil unter Ubuntu 16.04 LTS. Der Vorteil, man kann den echt skalieren und lässt sich über einen WIndowsrechner komplett administrieren. Da siehst du nicht wirklich einen Unterschied. Und die 'kleine' Version zum Testen ist in kurzer Zeit auf dem Rechner drauf. Allerdings nur genau auf der Version die M$ vorgibt, ansonsten kann es ein ödes gefrickel werden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Socke
Lazarusforum e. V.
Beiträge: 2799
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: SQL-Abfrage

Beitrag von Socke »

Wenn es dir nur um die Strukturinformationen des Ergebnisses geht, kannst du auch die Abfrage mit LIMIT 0 ausführen. Die Strukturinformationen stehen dem Client dann zusammen mit der leeren Ergebnismenge zur Verfügung (Felddefinitionen).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

MacWomble
Lazarusforum e. V.
Beiträge: 977
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 19.3 Cinnamon / FPC/Lazarus
CPU-Target: Intel i7 64/32 Bit
Wohnort: Freiburg

Re: SQL-Abfrage

Beitrag von MacWomble »

Ja, es geht um die Strukturinfo.
Ich brauche als Ergebnis die Felder wie bei DESCRIBE TABLE, nur eben für eine SELECT ....

Und das ganze eben variabel, so dass ich nach Möglichkeit die SELECT-Abfrage einfach vor dem Aufruf ersetzen kann.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Socke
Lazarusforum e. V.
Beiträge: 2799
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: SQL-Abfrage

Beitrag von Socke »

Name, Datentyp, Länge und Präzision, Zeichsatz und einiges weiteres bekommst du auch bei einem Statement SECECT * FROM dummy LIMIT 0 (SQLdb):

Code: Alles auswählen

var
  f: TField;
begin
  SQLDBLibraryLoader1.Enabled := True;
  MySQL57Connection1.Connected := True;
  SQLQuery1.Open;
  ListBox1.AddItem('Field, Type(Size,Precision)', nil);
  for f in SQLQuery1.Fields do
  begin
    ListBox1.AddItem(Format('%s, %s(%d,%d)', [
      f.FieldName,
      GetEnumName(TypeInfo(f.DataType), Integer(f.DataType)), f.Size, f.FieldDef.Precision
      ]), nil);
  end;
end;

Bisher habe ich noch keine Information über die weiteren bei DESCRIBE ausgegebenen Informationen Null, Key, Default und Extra gefunden - wobei diese bei einem CREATE TABLE t1 (SELECT * FROM) vermutlich ohnehin immer auf Serverstandards beruhen.

Wenn du bei deinem bisherige Weg mit der Prozedur bleiben willst, solltest du dort auch ein LIMIT 0 einfügen, da die SQL-Abfrage sonst immer komplett abgearbeitet wird, obwohl du nur die Struktur haben willst. Das ist gerade bei komplexen Abfragen recht zeitaufwändig.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

MacWomble
Lazarusforum e. V.
Beiträge: 977
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 19.3 Cinnamon / FPC/Lazarus
CPU-Target: Intel i7 64/32 Bit
Wohnort: Freiburg

Re: SQL-Abfrage

Beitrag von MacWomble »

Deine Lösung sieht gut aus und beinhaltet das, was ich brauche - Danke!
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Antworten