SQL-Statement parser?

Status
Nicht offen für weitere Antworten.
T

TheSunToucher

Gast
Hallo,

ich muss für ein aktuelles Projekt SQL-Statements parsen und diese unter Umständen verändern, also beispielsweise den Tabellennamen in einem Select-Statment finden und diesen ersetzen. Ich habe begonnen eine Java-Klasse zu schreiben und mit liebevoll gestalteten RegularExpressions einfache Statements zu parsen. Allerdings ist die ganze Angelegenheit sehr komplex, da bei SQL-Statements dem Einfallsreichtum mancher Entwickler keine Grenzen gesetzt sind. Lange Rede, kurzer Sinn, kennt jemand vieleicht ein (kostenloses, OpenSource) Produkt, mit dem man SQL zuverläßig parsen kann?

Ich stelle mir das so vor das ich ein "Statment"-Objekt mit Hilfe des SQLs anlege und dann mit Gettern und Settern arbeiten kann.

Danke, gruß
Tim
 

bronks

Top Contributor
Wenn Du noch ein bissl mehr zu Sinn und Zweck erklären könntest ... Mir kommt das ganze schon etwas bekannt vor, aber konkret ...
 
T

TheSunToucher

Gast
Ich versteh die Frage nicht, ich habe doch gesagt was ich machen will. Am besten soll er möglichst viel können, ich möchte den Tabellennamen ändern oder escapen können, ebenso Spaltennamen. Ich möchte values ersetzen können und vieleicht die Syntax ein bischen verändern.
Das ganze um die Unterschiede der Datenbanken auszugleichen. Zum Beispiel sind die Tabellennamen auf manchen Datenbank-Systemen Casesensitiv, auf anderen nicht. Oracle kennt keine Leerstrings usw...
 

Sky

Top Contributor
Verstehe ich das richtig: Du willst in Abhängigkeit von einer Eingabe
Code:
SELECT * FROM bla
und der zugehörigen DB, den Aufruf
Code:
SELECT * FROM blub
machen???

Also ich glaube, das es da nix fertiges gibt! Ich bin der Meinung, wenn sich jemand nicht an einen Standard halten kann, dann soll er die Finger von den Dingen lassen!
Ein Beispiel: Wenn es Datenbanken gibt, welche Casesensitiv arbeiten, dann sollte man die Tabellennamen immer korrekt angeben und die DB's, welche nicht Casesensitiv arbeiten werden auch damit zurecht kommen!
 

bronks

Top Contributor
TheSunToucher hat gesagt.:
Ich versteh die Frage nicht, ich habe doch gesagt was ich machen will.
Ich verstehe dagegen Deine Anforderung und meine, daß Du an die ganze Sache total anders rangehen mußt. Ich hab keine Ahnung, warum Du SQLs hast, die falsche Feld- und Tabellennamen enthalten und auch noch in der Syntax angepaßt werden müssen. Soetwas mach man m.E. anders und je nach Zweck total verschieden.
 

Bleiglanz

Gesperrter Benutzer
sowas (mit gettern und settern) gibts nicht

ich würd das lieber lassen, wie du schon erkannt hast kann handgestricktes optimiertes SQL extrem komplex werden, und diese Komplexität müsste das von dir gewünschte Tool auch mitmachen

...muss für ein aktuelles Projekt SQL-Statements parsen und diese unter Umständen verändern, also beispielsweise den Tabellennamen in einem Select-Statment finden und diesen ersetzen
das ist ziemliches Schrott-Design, vor allem wenn die SQL Statements schon fertig sind und nicht mehr adaptiert werden können

ansonsten würde ich eben mit Platzhaltern im SQL arbeiten (so ala Veleocty ${tab1} durch den "echten" Tabellennamen ersetzen

=> dazu müssten aber die SQL-Statements VORHER verändert werden...
 
T

TheSunToucher

Gast
Ich kann eure Einwände verstehen und hätte wahrscheinlich eine ähnliche Antwort verfaßt, aber ich habe mir diese Taktik nicht überlegt, sondern mein Chef. Ich muss das Problem lösen, also versuche ich es möglichst elegant. Die Statements ändern kommt nicht in Frage, sondern es soll an zentraler stelle geschehen.

Es gibt schon einige Sachen die an zentraler Stelle mit den SQL-Statements gemacht werden, das funktioniert schon ganz gut. Das jetztige Vorhaben überteibt's ein bischen, aber wie gesagt, ich kann nichts daran ändern.

Folgendes soll manipuliert/normalisiert werden:
  • Tabellen und Spaltennamen toUpperCase
  • escapen von reservierten wörtern, die als Tabellen- oder Spaltenname verwendet werden
  • besondere behandlung von LeerStrings auf Oracle
  • Syntax-Unterschiede wie z.B. "AS" auf Oracle

Wie auch immer, ich muss halt eine Lösung suchen. Ich habe im Internet eine Klasse gefunden die mit JavaCC geschrieben wurde, leider bietet die nicht die Möglichkeiten die ich mir erhofft hatte. Ich bin aber fest davon überzeugt das es sowas schon gibt, immerhin müssen "100% pure Java Datenbanken" ala HSQLDB die Statements auch parsen, oder liege ich falsch?

Is' komisch, aber ich wäre euch trotzdem für eure Tipps dankbar
Gruß
Tim
 

Bleiglanz

Gesperrter Benutzer
# Tabellen und Spaltennamen toUpperCase

überflüssiger Käse

# escapen von reservierten wörtern,
# die als Tabellen- oder Spaltenname verwendet werden

ja und? replacaAll? du weisst ja gar nicht, wann etwas markiert werden soll? SELECT 'SELECT','MAX','class','do while' FROM DUAL

da müsstest du ja immer noch die quotes mitzählen, ob das nicht zufällig eine literale Konstante ist

# besondere behandlung von LeerStrings auf Oracle

wahnsinn, wie soll denn das nun wieder gehen...?

# Syntax-Unterschiede wie z.B. "AS" auf Oracle

wozu?

Die Statements ändern kommt nicht in Frage, sondern es soll an zentraler stelle geschehen
Schon mal was von der broken window theorie gehört? Habe den starken Verdacht, dass hier ein schrotthaufen durch einen neuen (extrem aufwändigen) Layer noch repariert werden soll
 
T

TheSunToucher

Gast
Hi Bleiglanz,

wie gesagt ich hab mir den Mist nicht ausgedacht, muss es trotzdem machen, außer du bietest mir einen lukrativen Job in deiner Firma an ;-]

Bleiglanz hat gesagt.:
# Tabellen und Spaltennamen toUpperCase
überflüssiger Käse

Naja, wenn ich auf SQL-Server eine Binary-Kollation nutzen will sind die Spalten- und Tabellennamen Casesensitiv. Und auf Oracle anscheind immer, oder kennst du/ihr eine Möglichkeit das zu ändern?

Bleiglanz hat gesagt.:
# escapen von reservierten wörtern,
# die als Tabellen- oder Spaltenname verwendet werden

ja und? replacaAll? du weisst ja gar nicht, wann etwas markiert werden soll? SELECT 'SELECT','MAX','class','do while' FROM DUAL

da müsstest du ja immer noch die quotes mitzählen, ob das nicht zufällig eine literale Konstante ist

Dessen bin ich mir natürlich bewußt, einfache Statements wie das von die gepostete ersetzt meine Klasse schon vollkommen korrekt. Dafür habe ich mittlerweile 300 Zeilen Code und RegularExpressions, die mittlerweile wirklich unleserlich sind, aber das Ding kann schon eine ganze Menge. Aber der Fakt, das es mit replaceAll nicht getan ist, hat mich ja erst auf die Idee gebracht nach einen StatementParser zu suchen.

Bleiglanz hat gesagt.:
# besondere behandlung von LeerStrings auf Oracle

wahnsinn, wie soll denn das nun wieder gehen...?

Ich habe in der Vergangenheit schon etwas ähnliches für die Portierung nach SQL-Server in den Layer implementiert. Eigentlich ist unsere Anwendung auf DB2 zu Hause, da gibt es den SQL-Datentyp DATE, auf SQL-Server gibt es den nicht, sondern nur DATETIME. Da sich DATETIME anders verhält als DB2's DATE, habe ich auf SQL-Server ein VARCHAR daraus gemacht und beim abholen mit "resultSet.getString()" wird der String in ein Datum geparst.
Dieser Dirty-Trick funktioniert einwandfrei, wir mußten nicht mehrere Hundert Klassen und JSPs überarbeiten und es ist erfolgreich im Betrieb beim Kunden!
Daher könnte ich mir vorstellen, das ich sowas auch für Oracle basteln kann...

Bleiglanz hat gesagt.:
# Syntax-Unterschiede wie z.B. "AS" auf Oracle
wozu?

Die Syntax auf DB2, also unserer aktuellen Statements ist etwas anders als auf Oracle, um die Statements nicht alle prüfen zumüssen soll hier eine zentrale Änderung herbei. Hier (zu Hause) habe ich kein Oracle, ich werde bei gelegenheit mal ein paar Beispiele posten.

Bleiglanz hat gesagt.:
Die Statements ändern kommt nicht in Frage, sondern es soll an zentraler stelle geschehen
Schon mal was von der broken window theorie gehört? Habe den starken Verdacht, dass hier ein schrotthaufen durch einen neuen (extrem aufwändigen) Layer noch repariert werden soll

Tja, leider... und ich bin die arme Sau an der es hängen bleibt...
Nee, von der broken window theorie hab ich leider noch nix gehört, aber sobald ich "absenden" geklickt habe werde ich mal google'n.
 
T

TheSunToucher

Gast
Off-Topic @Bleigeiz:

Ich habe mehrere Artikel zur "broken Window Theorie" gefunden, ich schätze mal du nimmst bezug auf folgendes:

„Sozialpsychologen und Polizeibeamte stimmen darin überein, daß ein zerbrochenes Fenster in einem Gebäude, das nicht repariert wird, die Zerstörung der restlichen Fenster des Gebäudes innerhalb kürzester Zeit nach sich zieht. Dies gilt für gehobene Nachbarschaftsgegenden ebenso wie für heruntergekommene. Die Zerstörung von Fensterscheiben geschieht nicht deshalb übermäßig oft in einer Gegend, weil dort viele Zerstörer von Fensterscheiben leben, während sich in anderen Gegenden Fensterscheibenliebhaber aufhalten. Viel eher trifft zu, daß ein nicht wieder in Stand gesetztes Fenster ein Zeichen dafür ist, daß an diesem Ort keiner daran Anstoß nimmt. So können beliebig viele Fenster zerstört werden, ohne daß damit gerechnet werden muß, für den Schaden aufzukommen. (Es macht ja auch eine Menge Spaß.)“

Quelle: netzwerk.wisis.de/id~qV5o2QlDkSUNw9X3/text/335.htm

Aber was willst du mir damit sagen? Das wenn ich die inkompatiblen Statements nicht berichtige die anderen Programmierer weiter solche schreiben? Naja, wenn der StatementParser korrekt funktioniert, dann können sie das ja machen. Da wäre, als ob man ein Bild eines intakten Fensters vor die kaputten stellt, damit die Besucher denken die Gegend wäre ordentlich ;-]
 

Bleiglanz

Gesperrter Benutzer
damit ist eigentlich gemeint, dass man "Schrott" immer gleich reparieren soll (hab ich im "Pragmatic Programmer" gelesen, das Argument finde ich nicht schlecht)

300 zeilen code mit unleserlichen preparedStatements zusammenhacken - das kostet auch Zeit und Geld. Und wenn du jetzt einen Parser hast, kannst du diese Regexe wieder auf den Müll werfen...

Das Vertrauen aller im Projekt beteiligten Programmierer ist einfach dahin, wenn es nur eine einzige Stelle gibt, bei der alle sagen: "das ist hier Schrott, muss aber drinbleiben, weil..."

Andere Progger könnten verleitet werden zu sagen: "na ja, die ganze Datenbank-Zugriffsschicht ist eh schon Mist, da kann ich bei meinen eigenen Sachen auch ein paar wirre Hacks einbauen"...

mehrere Hundert Klassen und JSPs
in denen literal <% %> java quelltext UND SQL-Statements enthalten sind???!!!!??? Klingt nach Mülltonne...


klar, du kannst nix dafür, aber in dem Fall würde ich meinem Chef dringend ein komplettes Refactoring anraten!

JSP sollen kein Java enthalten

native SQL-Strings sollten an einer zentralen Stelle verwaltet werden

Wenn man wirklich DB unabhängig sein will, dann funktioniert das eigentlich nur mit Code-Generatoren bzw. den gängigen O/R Mappern

Ausserdem: Ihr habt eine Anwendung die von Oracle nach DB2 geschoben werden soll? Beide DBs bieten die Möglichkeit, Stored Procs und eingene Spaltentypen zu definieren, damit könnte man gewisse unterschiede wesentlich einfacher ausgleichen
 
T

TheSunToucher

Gast
Jo, ich gebe dir recht, aber die meisten Entscheidungen haben finanzielle, politische und persönliche Gründe. Ich und auch die meisten der Mitarbeiter kennen sehrwohl JavaServerFaces, Taglibs, Struts, Hibernate usw. Ich glaub es ist jedem klar das dieser historisch gewachsene Haufe Quellcode am besten komplett weggeschmissen und mit dem jetzigen KnowHow, der Erfahrung und aktuellen Techniken neuprogrammiert werden sollte, aber ich hab wohl keine Chance den Chef davon zu überzeugen. Deshalb ist es leider müßig darüber zu diskutieren...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T SQL-Statement Datenbank nach SQL Statement schließen? Datenbankprogrammierung 7
Kotelettklopfer SQLite Verhindern von doppelter Statement Ausführung Datenbankprogrammierung 25
L SQL-Statement SQL Statement doppelte Einträge finden Datenbankprogrammierung 9
C MySQL SQL Statement wir nicht ausgeführt Datenbankprogrammierung 11
G Datenbank Statement Datenbankprogrammierung 22
Dimax Erstellen ResultSet und Statement Datenbankprogrammierung 30
B MySQL Umkreissuche - brauche Hilfe bei SQL Statement Datenbankprogrammierung 12
M CSV Import - Dynamisches SQL Statement Datenbankprogrammierung 15
D Wiederverwendung / Recycling / Queuing von Statement Objekten Datenbankprogrammierung 1
D SQL Statement gesucht... Datenbankprogrammierung 15
J JDBC SQL Statement mit Parameter Datenbankprogrammierung 7
F Dynamischen String in SQL Statement einbinden Datenbankprogrammierung 9
L SQL Statement mit Switch-Case funktioniert nicht Datenbankprogrammierung 6
U PostgreSQL SELECT Statement Datenbankprogrammierung 5
A Problem mit Create-Statement Datenbankprogrammierung 9
LadyMilka MySQL Syntaxfehler im Statement Datenbankprogrammierung 3
A JDBC Prepared Statement Autoincrement Datenbankprogrammierung 3
P SQL-Statement Bei meinem Statement ist ein Fehler? Datenbankprogrammierung 2
P sql statement alter table foreign key Datenbankprogrammierung 4
T sql Statement Datenbankprogrammierung 9
B JDBC MySQL Statement Datenbankprogrammierung 3
A Sql Statement - Alle Zahlen größer 9 Datenbankprogrammierung 3
F Sql Statement Datenbankprogrammierung 12
A SQL-Statement prüfen Datenbankprogrammierung 3
W Statement als Klassenvariable Datenbankprogrammierung 27
I Select-Statement optimieren Datenbankprogrammierung 14
D SQLite Statement nimmt keine Namen aus getter-Methoden Datenbankprogrammierung 11
alex_fairytail MySQL SQL Statement Delete zwischen Datum1 und Datum2 Datenbankprogrammierung 5
M Access Update Statement Fehler update -> unmöglich? Datenbankprogrammierung 3
R Derby/JavaDB LIKE Statement mit Wildcard Datenbankprogrammierung 20
N Update Prepared Statement Fehler bei Argumenten Datenbankprogrammierung 3
R Select Statement als temporärer Table Datenbankprogrammierung 7
R Derby/JavaDB Select Statement Where bedingung will nicht ganz! Datenbankprogrammierung 4
R Derby/JavaDB Select TOP Statement geht nicht Datenbankprogrammierung 3
S Null Pointer exception statement Datenbankprogrammierung 8
R Derby/JavaDB Insert Statement Probleme Datenbankprogrammierung 14
K statement.execute liefert false Datenbankprogrammierung 6
C PostgreSQL Prepared Statement Datenbankprogrammierung 7
N Prepared Statement mit unbekannter Anzahl von Where-Clauses Datenbankprogrammierung 30
S SQL Statement: executeUpdate Datenbankprogrammierung 15
F wie funktioniert if Statement in SELECT? Datenbankprogrammierung 2
T MySQL PreparedStatement mit INSERTs langsam, Batch-Statement auch Datenbankprogrammierung 4
M MySQL größere von zwei Zahlen in Update Statement Datenbankprogrammierung 2
J [Hibernate] Select Statement Datenbankprogrammierung 4
S HSQLDB DELETE-Statement funktioniert nicht Datenbankprogrammierung 4
L MySQL Prepared Statement batch langsamer als bulk insert? Datenbankprogrammierung 10
L MySQL Kann Statement nicht erzeugen Datenbankprogrammierung 5
T Komme mit dem SQL Statement nicht weiter Datenbankprogrammierung 5
D MySQL Client - Server: Client verabschiedet sich sobald ich Variablen im SQL Statement verwende Datenbankprogrammierung 9
F Frage zu Prepared Statement Datenbankprogrammierung 2
T java.sql.SQLException: unexpected end of statement Datenbankprogrammierung 2
J SQL-Statement Datenbankprogrammierung 10
U MSSQL Verbindung steht, aber meckert beim Statement Datenbankprogrammierung 2
S executeBatch result immet mit Statement.SUCCESS_NO_INFO Datenbankprogrammierung 4
G Frage zum Insert-Statement Datenbankprogrammierung 2
J JDBC- Statement Ausführung nicht persistent Datenbankprogrammierung 2
A Connection Variable in anderer Klasse verwenden -> statement Datenbankprogrammierung 2
D Problem: Prepared Statement (Insert) funktioniert nicht. Datenbankprogrammierung 3
G Mit Prepared Statement in MDB schreiben Datenbankprogrammierung 7
Z DELETE-Statement Datenbankprogrammierung 6
W Prepared Statement und Verbindungsverlust Datenbankprogrammierung 4
G INSERT-STATEMENT Datenbankprogrammierung 6
alexpetri hsql statement problem Datenbankprogrammierung 3
W invalid sql statement ? Datenbankprogrammierung 3
S Probleme mit statement.close() Datenbankprogrammierung 10
G Wie ein SQL-Statement zusammensetzen? Datenbankprogrammierung 5
T Select Statement auf Relation Datenbankprogrammierung 3
S Connection/Statement/ResultSet auf einmal geschlossen Datenbankprogrammierung 8
G MsSQL | Statement.execute(String s) Datenbankprogrammierung 3
W Prepared Statement mehrere Zeichenketten Datenbankprogrammierung 4
G Keine Aussicht mit Prepared Statement Datenbankprogrammierung 10
G Für jede SQL-Abfrage eigenes Statement und ResultSet? Datenbankprogrammierung 3
C Statement/Connection SQLWarning Datenbankprogrammierung 4
J sql-statement Datenbankprogrammierung 7
G Update Statement automatisch unterteilen lassen Datenbankprogrammierung 3
P Prepared Statement scheint nicht zu funktionieren Datenbankprogrammierung 14
N Prepared Statement Datenbankprogrammierung 8
G Problem mit Suchen Statement Java und MS-SQL-Server Datenbankprogrammierung 9
J SELECT-Statement Datenbankprogrammierung 4
S Statement.getGeneratedKeys() funktioniert nicht Datenbankprogrammierung 4
G Problem mit Delete-Statement Datenbankprogrammierung 3
L mehrere Abfragen mit einem Statement!? Datenbankprogrammierung 5
E Problem mit create-Statement Datenbankprogrammierung 5
E SQL-Statement um eine Nummer in der Datenbank zu suchen Datenbankprogrammierung 3
U Dom Parser und SQLite füllen Datenbankprogrammierung 5
G SQL Parser Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben