Beschreibung
In der Praxis sollen oft Daten aus mehreren Tabellen einer Datenbank ausgelesen werden. Die Klasse DefaultSQLCron erleichtert diese Aufgabe. Sie liest aus einer Konfigurationsdatei die SQL-Statements und die Abhängigkeiten zwischen den Tabellen.
Versehen Sie die SQL-Statements mit aufsteigenden Namen select.<n>. Vergeben Sie alle Nummern lückenlos. Beginnen Sie bei 0. Legen Sie zwischen den SQL-Statements Abhängigkeiten fest. Verwenden Sie dafür die Form dependencies.<n>=<s>:<m>:
s steht für den Index des SQL-Statements.
m steht für den Index der Spalte innerhalb der Ergebnismenge.
n steht für den Index der Abhängigkeit.
Beispiel: dependencies.1=0:2 legt fest, dass das SQL-Statement select.1 von der zweiten Spalte aus der Ergebnismenge von select.0 abhängt. Mehrere Spalten geben Sie kommagetrennt an, zum Beispiel dependencies.1=0:2,0:3.
Konfiguration: im Business Connector (Eingangsagent Cron).
WICHTIG Beim ersten Mal ist es nicht leicht, die Konfigurationsdatei manuell zu erstellen. Nutzen Sie dafür den SQL-Konfigurations-Assistenten.
HINWEIS Die Quellstruktur für die Eingangsdatei erzeugen Sie im Menü der Quellstruktur.
Parameter
Parameter | Beschreibung |
|---|---|
db_alias | Gibt den Datenbank-Alias an, auf den zugegriffen wird. Siehe Abschnitt Databases/connectors (Konfiguration). Sie können auch Variablen aus vorangegangenen Profilen oder Parameterwerte von HTTP-Triggern verwenden. Beispiel: db_alias=@MSG_CALL_DB_ALIAS@. |
pre.statement | Sie können mehrere Pre-Statements formulieren. Trennen Sie sie mit einem Semikolon (;). |
post.statement | Sie können mehrere Post-Statements formulieren. Trennen Sie sie mit einem Semikolon (;). |
save_as_csv | Geben Sie einen Dateipfad an. An diesem Pfad legt das System eine CSV-Datei mit den Eingangsdaten an. |
result.split | Werte: true oder false. Bei true erzeugt das System für jede Zeile von select.0 einen neuen Job. Dies funktioniert nur unter zwei Bedingungen. Erstens müssen mindestens zwei SQL-Statements (select.0 und select.1) existieren. Zweitens muss eine Abhängigkeit (dependencies.1) existieren. HINWEIS Bei nur einem SQL-Statement nutzen Sie folgenden Trick. Erzeugen Sie ein Dummy-Statement select.1, dessen Bedingung nie greift. So entsteht keine zusätzliche Ergebniszeile. Setzen Sie zusätzlich ein beliebiges dependencies.1. Beispiel: |
select.<n> | Legt die SQL-Statements fest. Beginnen Sie bei 0 und erhöhen Sie immer um 1. HINWEIS Zeilenumbrüche kennzeichnen Sie mit \. Beispiel: |
dependencies.<n> | Hinterlegt die Abhängigkeiten des jeweiligen select.<n>. |
limit.<n> | Setzt ein Limit für die Anzahl an Zeilen von select.<n>. Ein Limit von 0 bedeutet keine Einschränkung. Das gleiche Ergebnis erreichen Sie, wenn Sie den Parameter weglassen. |
empty.<n> | Definiert ein Dummy-Ergebnis für select.<n>, falls select.<n> kein Ergebnis liefert. |
MSG_CALL_<VARNAME> | Siehe Erläuterungen unten. |
encode_blob | Werte: true oder false. Bei true kodiert das System BLOB- und CLOB-Felder mit Base64. |
use_raw_content | Bei false (Standard) liefert das System die Ergebnismenge als CSV-Zeilen zurück. Angenommen, es gibt vier Ergebnis-Spalten und drei Ergebnis-Zeilen: Bei true liefert das System die gesamte Ergebnismenge in einer Zeile ohne CSV-Trennzeichen zurück: |
In den WHERE-Bedingungen der select.<n> setzen Sie Platzhalter ein. Diese Platzhalter legen die Abhängigkeiten fest. Der Platzhalter @1:i@ ersetzt die erste Spalte aus den zugehörigen dependencies. Der Platzhalter @2:i@ ersetzt die zweite Spalte. Das i im Platzhalter steht für den Datentyp, hier Integer. Die folgende Tabelle zeigt alle Datentypen.
Sie können auch Werte von Variablen verwenden. Erlaubt sind nur Variablen aus vorangegangenen Profilen oder Parameterwerte von HTTP-Triggern. Die Variablen müssen im Profil definiert sein. Beispiel: Sie definieren in der Konfigurationsdatei MSG_CALL_MYVAR=100. Der Wert der Variablen füllt dann den Platzhalter @100:i@.
WICHTIG Die Platzhalter-Nummer für Variablen darf nicht kleiner als 100 sein.
Kürzel | Datentyp |
|---|---|
i | Integer |
f | Float |
r | Real |
d | Date |
t | Timestamp |
s | String |
l | Long |
v | Boolean |
b | Blob |
x | Textstream |
Sie können auch den Zeitpunkt des letzten erfolgreichen Profilstarts in einer WHERE-Bedingung verwenden. Dafür stehen drei Platzhalter zur Verfügung.
Platzhalter | Bedeutung |
|---|---|
@0:t@ | Zeitpunkt des letzten Profillaufs als Timestamp. |
@0:d@ | Zeitpunkt des letzten Profillaufs als Date. |
@0:s#<template>@ | Zeitpunkt als formatierter String. Beispiel: @0:s#yyyyMMdd@ liefert 20150310 für den 10.3.2015. Für ein W3C-konformes Datums- und Uhrzeitformat verwenden Sie @0:s#yyyyMMdd'T'HH:mm:ss.SSS@ oder @0:s#. |
WICHTIG @0:s#<template>@ wird nur einmal aufgelöst. Ein weiteres Vorkommen von @0:s#<template>@ mit einem abweichenden Template hat keinen Effekt. Stattdessen verwendet das System den zwischengespeicherten Wert des ersten Vorkommens.
Beispiel
HINWEIS Sie können auch Systemkonstanten mit der Syntax %CONSTANT% verwenden.
WICHTIG Angenommen, Sie haben eine String-Variable MSG_CALL_MYVAR mit dem Inhalt 'USA','UK'. In der unten gezeigten Konfigurationsdatei definieren Sie MSG_CALL_MYVAR=100. Die SQL-Abfrage SELECT id, name FROM supplier WHERE country IN (@100:s@) funktioniert dann nicht.
Der Grund: Der Platzhalter repräsentiert einen String. Die Abfrage löst nicht zu SELECT id, name FROM supplier WHERE country IN ('USA','UK') auf. Stattdessen löst sie zu SELECT id, name FROM supplier WHERE country IN (''USA','UK'') auf.
Solche Abfragen lösen Sie nur über die dependencies, wie unten gezeigt. Der SQL-Konfigurations-Assistent unterstützt Sie dabei.
#
# Sample config file for DefaultSQLCron
#
#Which db connection to use
db_alias=hub
#You can define multiple pre- and post-statements here (separated by ";"), like:
#pre.statement=lock table table_a in exclusive mode;lock table_b in exclusive mode
#post.statement=
#Create CSV file for debugging - uncomment if needed.
#save_as_csv=/tmp/sqldump.csv
#For each row of select.0 create a new request (job) if param is set to true.
result.split=false
#If BLOB columns are selected, you may want to encode the content with Base64.
#encode_blob=true
#
#Here are the statements... must start with 0, step size is 1!
#
select.0=select 'A',id,name from order where date_at > @0:d@
select.1=select 'B',id,item_number from item where order_id = @1:i@
select.2=select 'C',id,text from item_text where item_id = @1:i@
#
#select.1 needs value (column at position 2) from statement 0 (select.0) for execution (join); multiple columns are separated by ','.
#select.2 needs value (column at position 2) from statement 1 (select.1) for execution (join); multiple columns are separated by ','.
#Offset for counting column positions is always 1. First dependency references to @1:xxx@, etc.
#Note: To use the time of the last time a cron job was executed, use tag @0:d@ or @0:t@ for date or timestamp.
#
dependencies.1=0:2
dependencies.2=1:2
#
#(Passed) variables can be used as well, if defined in the profile.
MSG_CALL_MYVAR=100
# This will replace filler @100:i@ in any SQL select statement by the integer value of the named variable.
#
#
#Use limit.xxx to limit the result set, e.g.
#limit.0 = 500
#will limit select.0 to 500 rows. If not set, no limit is given.
#If an SQL statement returns no results, you can define a dummy result instead.
#Define a valid CSV line with delimiter ';'.
#An example for a 'dummy' result for select.0:
#empty.0=A;0;NothingSie möchten drei Tabellen auslesen: order, item und item_text. Die Tabellen sind jeweils durch 1:n-Beziehungen verknüpft. Zu einem Auftrag (order) gehören beliebig viele Positionen (item). Zu einer Position gehören beliebig viele Positionstexte (item_text).
Die Tabelle order:
id | name | date_at |
|---|---|---|
10 | order_1 | 01.01.2014 |
11 | order_2 | 01.01.2014 |
Die Tabelle item:
id | item_number | order_id |
|---|---|---|
20 | item_1 | 10 |
21 | item_1 | 11 |
22 | item_2 | 11 |
Die Tabelle item_text:
id | text | item_id |
|---|---|---|
30 | text_1 | 20 |
31 | text_2 | 20 |
32 | text_3 | 22 |
Das System führt das erste SQL-Statement select.0 aus. Dabei ersetzt es die Variable @0:d@ durch das Datum des letzten Profildurchlaufs. Die Datenbank liefert folgendes Ergebnis:
A | 10 | order_1 |
A | 11 | order_2 |
Aus der ersten Zeile
A | 10 | order_1 |
der Ergebnismenge von select.0 entstehen die dependencies.1:
10 |
Das System führt select.1 mit den dependencies.1 aus:
B | 20 | item_1 |
Aus dieser Ergebnismenge entstehen die dependencies.2:
20 |
Das System führt select.2 mit den dependencies.2 aus:
C | 30 | text_1 |
C | 31 | text_2 |
Das System fasst die Ergebniszeilen zum ersten Teilergebnis zusammen:
A | 10 | order_1 |
B | 20 | item_1 |
C | 30 | text_1 |
C | 31 | text_2 |
Analog dazu verfährt das System mit der zweiten Zeile
A | 11 | order_2 |
der Ergebnismenge aus select.0.
Es entstehen die dependencies.1:
11 |
Dann liefert select.1:
B | 21 | item_1 |
B | 22 | item_2 |
Die dependencies.2 ergeben:
21 |
22 |
select.2 liefert für die erste Zeile von dependencies.2 kein Ergebnis. Für die zweite Zeile von dependencies.2 liefert select.2:
C | 32 | text_3 |
Das System fasst auch diese Ergebniszeilen zu einem weiteren Teilergebnis zusammen:
A | 11 | order_2 |
B | 21 | item_1 |
B | 22 | item_2 |
C | 32 | text_3 |
Das System erstellt aus den Teilergebnissen das Gesamtergebnis und übergibt es an das Profil:
A | 10 | order_1 |
B | 20 | item_1 |
C | 30 | text_1 |
C | 31 | text_2 |
A | 11 | order_2 |
B | 21 | item_1 |
B | 22 | item_2 |
C | 32 | text_3 |
Leerzeichen im Abfrage-Ergebnis (MSSQL/Informix)
Bei MSSQL- und Informix-Datenbanken bereinigt das System die Ergebniswerte von SQL-Aufrufen standardmäßig um vorangestellte und nachfolgende Leerzeichen. Mit dem Parameter skipTrimResultValues ändern Sie dieses Verhalten. Den Parameter setzen Sie in der Konfigurationsdatei des Datenbank-Alias.