DefaultSQLCron

Prev Next

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:

result.split=true
select.0=select 'T001', date_at, order_no from orders where amount>10
select.1=select 1 from dual where 1=2
dependencies.1=0:2

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:

select.1=select 1 from dual \
where 1=2

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:

T001;1253698848119000;0;ASM
T001;1256310126906000;0;Lobster
T001;1304947631473000;0;CONRAD

Bei true liefert das System die gesamte Ergebnismenge in einer Zeile ohne CSV-Trennzeichen zurück:

T00112536988481190000ASMT00112563101269060000LobsterT00113049476314730000CONRAD

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;Nothing

Sie 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.