Einzelnen Beitrag anzeigen

Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.838 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

Re: DLEX und DYACC: SQL bzw PL/SQL Parser ?

  Alt 17. Nov 2008, 08:19
Hallo,
zuerst einmal Danke für Eure Antworten.

Zitat von alzaimar:
Wieso schickst Du das Skript nicht einfach zum Server und überlässt dem die Arbeit?
Welche zusätzlichen Befehle / Features möchtest Du einbauen?
Alle Datenbankänderungen werden bei uns per Skript geliefert.
Diese werden analysiert und um weitere Anweisungen ergänzt.
(grants, stored procedure Aufrufe, ...)
Außerdem sollen bestimmte "Langläufer" erkannt werden. (z.B. Updates auf bestimmte Tabellen)
Diese bearbeiteten Skripte werden auf einer speziellen Test Datenbank ausgeführt und wenn keine Fehler aufgetreten sind auf der Produktionsdatenbank.
Wir haben viele Datenbanken, einige davon im mehrstelligen TerraByte Bereich mit sehr sensiblen Daten, da kann man nicht eben mal ein Skript auf der Produktion laufen lassen.
Das Tool soll ein Bestehendes ablösen und den DBAs etwas Arbeit abnehmen.

Ich habe mittlerweile ein kommerzielles Produkt entdeckt, dass auf lexx/yacc basiert.
GSP - general sql parser ( http://www.sqlparser.com/howto.php )
(Die VCL Version besteht aus einer Hand voll *.dcu Dateien, es muss also keine dll mitgeliefert werden.)

Es macht eigentlich einen guten Eindruck. Ich war nur über das Beispielprogramm in der Trail entsetzt und hoffe, das der eigentliche Code nicht so katastrophal programmiert ist.
Kleines Beispielprogramm -> nicht kompilierfähig, >250 Compilerwarnungen, nicht gerade übersichtlich programmiert.

Aber mit einem eigenen kleinen Beispielprogramm bin ich sehr schnell zum Ziel gekommen.

Delphi-Quellcode:
...
var
  SqlParser: TGsqlparser;
  i: Integer;
  j: Integer;
  s: string;
begin
  // Parser mit Create erzeugen, Sprache (=Oracle) zuweisen.
  SqlParser := TgSqlParser.Create(DbvOracle);

  // SQL (PL/SQL) Text zuweisen
  SqlParser.SqlText.Assign(Memo1.Lines);

  if SqlParser.Parse = 0 then
  begin
    ...
    for i := 0 to SqlParser.SqlStatements.Count - 1 do
    begin
    ....
      // in SqlParser.SqlStatements[i].SqlStatementType steht der Typ z.B. update, create view, ...

      // verwendete Tabellen in dem Statement:
      for j := 0 to SqlParser.SqlStatements[i].Tables.Count - 1 do
      ...

      // neu formatiertes SQL (Die Formatierung lässt sich über diverse properties beeinflussen.)
      s := SqlParser.SqlStatements[i].PrettySql;
      // unverändertes SQL
      s := SqlParser.SqlStatements[i].GetTextFromParseTree

      // Auf die einzelnen Bestandteile der eigentlichen SQL Statements,
      // kann man natürlich mit bestimmten Properties analog zu oben auch zugreifen.
      // Es gibt auch die Möglichkeit auf den Lexxer und Syntaxbaum direkt zuzugreifen.
      // Damit ist dann alles möglich...
      ...
    end;
    ...
  end;
  ...
end;
...
Eine site Lizenz kostet nur 220 USD. Für das Geld bekomme ich es nicht selbst programmiert.
Wir haben es bestellt. Ich werde mal was zu meinen Erfahrungen schreiben, wenn ich das Projekt realisiert habe.
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat