Das datasqill Modul DsModTemplateSQL übergibt dem FreeMarker Interpreter (zusätzlich zum FreeMarker Skript) Variablen, damit das Skript den Code anhand der beteiligten Tabellen mit Spalten und eingestellten Parameter generieren kann.
Das Skript kann nun aufgrund der Variablen das effektive SQL generieren.
Möchte man z.B. das INSERT INTO mit dem korrekten Tabellen (und optional Schemanamen) generieren, dann sieht es in FreeMarker so aus:
INSERT INTO ${target}
Ist das Zielobject im datasqill Modell nun die Tabelle holiday im Schema SOFTQUADRAT, dann wird der Code
INSERT INTO SOFTQUADRAT.holiday
generiert.
Die Variable target wird vom DsModTemplateSQL zur Verfügung gestellt.
Name | Datentyp | Bedeutung |
---|---|---|
database_product_name | String | Datenbankname laut Antwort vom jdbc-Treiber |
action | String | Die Transformationsanweisung (SQL) |
action_id | Number | Id der Action (Transformation) |
batch_instance_id | Number | Id der Batch Instance (Laufender Batch), bzw. -1 beim Validate |
request_id | Number | Id des eindeutigen Requests (Siehe request-Tabelle) |
schedule_date | String | Startdatum in UTC Zeit des Batches im Format yyyy-MM-ddTHH:mm:ss.SSSSSSSSSZ |
module_start_timestamp | String | Ausführungsstart des Modules in lokaler Zeit im Format yyyy-MM-dd HH:mm:ss.SSS |
module_start_datetime | String | Ausführungsstart des Modules in lokaler Zeit im Format yyyy-MM-dd HH:mm:ss |
module_start_date | String | Ausführungsstart des Modules in lokaler Zeit im Format yyyy-MM-dd |
module_utc_start_timestamp | String | Ausführungsstart des Modules in UTC Zeit im Format yyyy-MM-dd HH:mm:ss.SSS |
module_utc_start_datetime | String | Ausführungsstart des Modules in UTC Zeit im Format yyyy-MM-dd HH:mm:ss |
module_utc_start_date | String | Ausführungsstart des Modules in UTC Zeit im Format yyyy-MM-dd |
connection_id | Number | Database ID (Connection ID) der Datenbankverbindung |
target_connection_id | Number | Database ID (Connection ID) der Datenbankverbindung |
target_schema | String | Schemaname der Zieltabelle. Kann zukünftig leer sein |
target_schema_quoted | String | Schemaname der Zieltabelle der Zieldatenbank in Identifier Quotes, falls notwendig |
target_table | String | Tabellenname der Zieltabelle |
target_table_quoted | String | Tabellenname der Zieltabelle der Zieldatenbank in Identifier Quotes, falls notwendig |
target | String | Schemaname mit "." (falls gegeben) und Tabellenname der Zieltabelle jeweils in Quotes, falls notwendig |
target_partition | String | Partitionsname der Zieltabelle |
sources | Object | Eine Liste der Quellobjekte vom Datentyp ObjectDs |
iteration | Number | Bei Loop Queries gibt es eine fortlaufende Nummer pro Loop Ergebnis. Sonst 1 |
all_tgt | TemplateColumn | Liste aller Spalten in der Zieltabelle |
all_src | TemplateColumn | Liste aller Spalten in der Quellabfrage |
other_tgt | TemplateColumn | Liste aller Spalten ohne die durch Parameter definierte Spalten in der Zieltabelle |
other_src | TemplateColumn | Liste aller Spalten ohne die durch Parameter definierte Spalten in der Quelltabelle |
Name | Datentyp | Bedeutung |
---|---|---|
source_schema | String | Schemaname der Quelltabelle |
source_table | String | Tabellenname der Quelltabelle |
source_partition | String | Partitionsname der Quelltabelle |
In datasqill kann man Modulattribute hinterlegen, die dann in der datasqill GUI angezeigt und editiert werden können.
Dazu kann man für die Zwecke des Templates die Attribute definieren. Diese können dann im Template verwendet werden. So kann man im Historize Modul z.B. angeben, ob beim Abgleich gelöschte Daten berücksichtigt werden sollen (Boolean), oder welche Schlüssel den Primary Key der Historisierung definiert (TemplateColumn). Auch Einzelspalten (TemplateColumn) sind dort (für den Anwender unsichtbar) hinterlegt. Diese definierten Attribute werden mit dem Attributsnamen als Variablen dem FreeMarker Interpreter zur Verfügung gestellt.
Attribute vom Typ BOOLEAN, werden als boolsche Variable übergeben. Wenn die Attribute vom Typ CHAR sind und sie mit "RC:", "RL:", "OC:" oder "OL:" beginnen, dann werden sie in eine Liste von TemplateColumn umgewandet. Ansonsten werden sie direkt als String übergeben.
Attributswertanfang | Datentyp | Bedeutung |
---|---|---|
OC: | Optionale Spalte (Optional Column) | Der Anwender gibt eine oder keine Spalte an |
OL: | Optionale Spaltenliste (Optional List) | Eine kommaseparierte Liste von Spalten. Sie darf leer sein |
RC: | Erfolderliche Spalte (Required Column) | Der Anwender muss genau eine Spalte angeben |
RL: | Erfolderliche Spaltenliste (Required List) | Eine kommaseparierte Liste von Spalten. Sie darf nicht leer sein |
Beispiele aus dem Historize Modul:
Name | Wert | Kommentar |
---|---|---|
is_deleted | OC:is_deleted | Die Spalte ist optional. Ist sie nicht gegeben, dann ändert sich die Logik des Templates |
key | RL:${tgt_pk_list} | Die Spaltenliste ist erforderlich. In diesem Beispiel werden die Primary keys der Zieldatenbank verwendet |
key | RL:spalte1,spalte2 | Die Spaltenliste ist erforderlich. In diesem Beispiel werden sie manuell angegeben |
ignore_columns | OL: | Die Spaltenliste ist nicht erforderlich. Alle angegebenen Spalten werden beim Historize ignoriert |
Der Datentyp ObjectDs leitet sich direkt aus der Tabelle vv_sqts_object in der Repositorydatenbank ab:
Name | Datentyp | Kommentar |
---|---|---|
sqtsObjectId | Number | Eindeutige ID des Objekts (Tabelle) |
sqtsObjectTypeId | Number | ID des ObjektTyps. |
serverId | Number | ID des Connection (database_id) |
objectName | Number | Names des Objekts (Tabellenname) |
objectOwner | Number | Names des Owners (Schemaname) |
objectPartition | Number | Partitionsname |
In der Regel sind die oben angegebenen Spalten-Variablen eine Liste vom Datentyp TemplateColumn Der Datentyp TemplateColumn sieht folgendermaßen aus:
Name | Datentyp | Kommentar |
---|---|---|
name | Number | Name der Spalte, gegebenfalls gequoted |
unquotedName | Number | Name der Spalte |
nullable | Boolean | Gibt an, ob die Spalte den Wert NULL annehmen kann |
[#if with_delete!false]Text1[#else]Text2[/#if]
Ist with_delete true, dann ergibt es:
Text1
Ist with_delete false (oder nicht gesetzt, angegeben mit !false), dann ergibt es:
Text2
[#if !["Oracle","PostgreSQL"]?seq_contains("${database_product_name}")]
[#stop 'This Module does not support ' + database_product_name + " databases"]
[/#if]
WHERE [#list key as col]src.${col.name} = tgt.${col.name} [#sep]
AND [/#list]
[#sep] führt dazu, dass der folgende Teil nach der letzten Spalte nicht mehr generiert wird.
Besteht der key aus spalte1 und spalte2 dann wird folgender Code generiert:
WHERE src.spalte1 = tgt.spalte1
AND src.spalte2 = tgt.spalte2
Besteht der key aus spalte1 und spalte-2 dann wird für die Datenbank MySQL folgender Code generiert:
WHERE src.spalte1 = tgt.spalte1
AND src.spalte2 = tgt.`spalte-2`
Bei den meisten anderen Datenbanken wird folgender Code generiert:
WHERE src.spalte1 = tgt.spalte1
AND src.spalte2 = tgt."spalte-2"
[#list sources as src][#if "${src.sqtsObjectTypeId}" == "1"]${src.objectOwner}.${src.objectName}
[/#if][/#list]
Wenn als Datenbankquellen (es kann auch noch weitere Quellen geben) die beiden Tabellen tab1 und tab2 im Schema SOFTQUADRAT angegeben wurden, dann wäre die Ausgabe:
SOFTQUADRAT.tab1
SOFTQUADRAT.tab2