Software
Hardware
Logik
informatik-berlin.de

Herzlich Willkommen bei informatik-berlin.de - Home of DyQL!

SQLse ist ein Programm zur Erstellung von äußerst umfangreichen SQL-Anweisungen aller Dialekte oder anderer beliebiger, strukturierter Texte. Dies können sowohl SQL-, xml- oder auch html-Texte sein. Mit Hilfe von Variablen werden modulartige Strukturen geschaffen.

Diese Methode wird hier Dynamic Query Language genannt, ist aber keine neue Sprache. Vielleicht könnte man es einen Word-Processor, oder altmodisch, Makrosprache nennen. Jeder Programmierer, der mit Datenbanken arbeitet, hat bereits die Grundidee in seine Programme eingebaut:

strSQL = "select * from " & strTabellenName & " where Nr = '" & strNummer & "'"

Doch DyQL ist wesentlich flexibler, wenn es darum geht, redundanten Code zu verhindern, z.B. bei mehrfachen SubSelect- oder UnionSelect-Statements:

select * from {Union_Select} t1 where t1.Nr = {Nr_Sub_Select} and t1.Adr like {Adr_Sub_Select}



DyQL

DyQL ist zu einem unverzichtbaren Werkzeug geworden, um komplexe Reports mit einem einzigen SQL Statement erzeugen zu können!

Seit 2003 wurde DyQL stetig weiter entwickelt und befindet sich seitdem im täglichen Einsatz. Das Prinzip ist denkbar einfach und leicht programmierbar - ein Appell an alle Software-Hersteller und Programmierer ein solches Modul zu integrieren!

Mit ein wenig Fantasie könnte man zusätzlich ein aus wenigen Programmzeilen bestehendes User-Interface integrieren und könnte Eingaben von einem variablen Eingabeformular in einen SQL-String übergeben. Das kleine Programm SQL.exe leistet seit Jahren gute Dienste auf vielen Desktops als Schnittstelle zu Oracle- oder Access-Datenbanken.



Variablentypen

Alle Variablennamen beginnen mit einem { und enden mit dem } Zeichen. Zu einer Variable gehört auch ein entsprechender Inhalt als Ersatztext. Eine Variable kann Bestandteil einer anderen Variable sein. Verschachtelungen sind möglich und nicht begrenzt.



Type 1 - Simple Variable

var name=frmRAND;
select * from {name};



Type 2 - Complex Variable

Dieser Variablentyp kann sehr lange, mehrzeilige Texte übertragen. Es sieht wie xml aus, ist es aber nicht.

select RAND.* from SUBJECTS, {table} RAND where SUBJECTS.SUBJECTID = RAND.SUBJECTID;

<extends>
<table>
(select
SUBJECTID, VISITMNEMONIC, RANDDATE
from
frmRAND
where
{sitefilter})
</table>
</extends>


Type 3 - Variable mit Parameter

Type 2 und 3 sind miteinander verwandt. Type 3 überträgt zusätzlich Parameter.

select * from {table, n=2};

<extends>
<table>
(select SUBJECTID, VISITMNEMONIC, RANDDATE from frmRAND_V{n} where {sitefilter})
</table>
</extends>

(ab Version 1.1.233)
select * from {table n="2" m="3"};



Type 4 - Repeating Variable

(ab Version 1.1.227)

Wiederhole den Inhalt einer Variable x Mal mit einem oder mehreren Parametern. Der erste Parameter gibt die Anzahl der Wiederholungen vor. Der zweite Parameter kann auch weniger Elemente enthalten. Der jeweils letzte Wert wird dann entsprechend wiederholt.

select SUBJECTID {fields, n=1, 2, 3, 4} from {table, n=2};
or
select SUBJECTID {fields, n= {1..4} } from {table, n=2};-- nur für numerische Parameter
or
select SUBJECTID {fields, n= {1..4} , m=A,B,C,D} from {table, n=2};-- Parameter m wird 4 Mal wiederholt
or
select SUBJECTID {fields, n= {1..4} , m=Q} from {table, n=2};-- Parameter m wird ebenfalls 4 Mal wiederholt

<extends>
<table>
(select SUBJECTID, VISITMNEMONIC, RANDDATE from frmRAND_V{n} where {sitefilter})
</table>

<fields>
, fieldname{m}{n} as "Field {n}"
</fields>
</extends>

(ab Version 1.1.233)
select SUBJECTID {fields, n={a..e}} from {table, n=2};
or
select SUBJECTID {fields, n={A..E}} from {table, n=2};



Type 5 - Super Variable

Eine Super-Variable ist ein einfaches Konstrukt. Der Variableninhalt ist der Name einer anderen Variable.

var first=second;
var second=third;

{{first}}

Dieses Beispiel gibt das Literal third zurück, den Inhalt der Variable second. Die Verschachtelung ist nicht begrenzt.

Eine besondere Variante des Typs 5 ist die kombinierte Variablenname:

{getvalues, n=Yes}
{getvalues, n=No}
{getvalues, n=}

<extends>
<getvalues> {depvar{n}} </getvalues>--combination of next variable name
<depvarYes> This is the content for getvalues = Yes </depvarYes>
<depvarNo> This is the content for getvalues = No </depvarNo>
<depvar> This is the content, if n is empty </depvar>
</extends>



DyQL Beispiel

select col1, col2, col3 from {tab_union} t1 where col3 = {MaxWert};

-- Hier beginnen die Variablendeklarationen:

<extends>

<tab_union>
(
select {felder} from tabelle1 where col1 in ({filter1, w=wert4})
union
select
{felder} from tabelle2 where col1 in ({filter2, w=wert7})
)
</tab_union>

<MaxWert>
(
selext max(t2.col4) from {tab_union} t2 where t2.col1 = t1.col1 group by t2.col1
)
</MaxWert>

<felder>col1, col2, col3, col4, col5</felder>

<filter1>'wert1', 'wert2', 'wert3', '{w}'</filter1>
<filter2>'wert4', 'wert5', 'wert6', '{w}'</filter2>

</extends>



Ergebnis

Die Datenbank-Engine hat kein Problem mit derartigen Strukturen. Doch der Mensch kann diese Zeichenfolge kaum überblicken. Wo beginnt eine Teilstruktur und wo endet sie? DyQL ist hier sehr hilfreich und fokusiert die einzelnen Elemente zu logischen Einheiten.

select col1, col2, col3 from ( select col1, col2, col3, col4, col5 from tabelle1 where col1 in ('wert1', 'wert2', 'wert3', 'wert4') union select col1, col2, col3, col4, col5 from tabelle2 where col1 in ('wert4', 'wert5', 'wert6', 'wert7') ) t1 where col3 = ( selext max(t2.col4) from ( select col1, col2, col3, col4, col5 from tabelle1 where col1 in ('wert1', 'wert2', 'wert3', 'wert4') union select col1, col2, col3, col4, col5 from tabelle2 where col1 in ('wert4', 'wert5', 'wert6', 'wert7') ) t2 where t2.col1 = t1.col1 group by t2.col1 )