Auswert-Hilfstabellen erzeugen (Cursorlauf - UDF)

Die UDF (Benutzer definierte Funktion) skrpps_02.skr_create_secundary_db_tables(…) erzeugt vier Zwischentabellen.
Diese Tabellen bereiten Rohdaten für den gewählten Zeitabschnitt und die angegebenen Maschinen auf. Die in der Folge auszuführenden Reports, mit Ausnahme des Garnbedarfs und der zu erwarteten Stückzahl, bauen darauf auf.

Diese Funktion ist in pgSql implementiert, ruft aber intern auch UDF auf, die in C++ implementiert sind.

UDF und Aufrufparameter

UDF:skrpps_02.skr_create_secundary_db_tables(…)

Parameter

Type

Beschreibung

_sDest_Schema

text

Schema, in welchem die erzeugten Tabellen abgelegt werden sollen ('report_01'_03'). Wenn temporäre Tabellen erzeugt werden (bevorzugt), muss _sDestSchema immer leer‘ ‘ sein

_sTable_Prefix

text

Prefix der erzeugten Tabellen, z.B. Ihr Benutzername.
Kennzeichnet Ihre Tabelle, da auch andere Benutzer Tabellen anlegen könnten.

_eTable_Type

skrpps_02.e_sec_tabletype

  • 'eUnlogged' für normale Unlogged-Tabellen
  • 'eUnloggedTemp' für temporäre Tabellen

_sSrc_Schema

text

Source-Schema ('skr' oder 'skr_archive'). 'skr_archive' ist nur dann verwendbar, wenn Sie zuvor in dieses Schema eine abgesicherte skr DB geladen haben.

_mcids

integer[]

SKR-Maschinen-Id’s der Maschinen, die in die sekundäre Datenbank aufgenommen werden sollen.
Z.B.: ARRAY[1399537134,1399537135]

_starttime

starttime timestamp without time zone

Startzeitpunkt der Daten

_endtime

starttime timestamp without time zone

Endzeitpunkt der Daten

_Iterator
[in]

integer DEFAULT 999999

Mit Hilfe des Iterators kann der Cursorlauf auf mehrere Einzelaufrufe von skr_create_secondary_db_tables(…) aufgesplittet werden. Z.B. um einen Fortschrittsbalken zu realisieren.
Von der Anzahl der Maschinen in _mcids wird bis auf 0 heruntergezählt. Der neue Iteratorwert ist der Rückgabewert (return) dieser UDF, den man nach Ablauf von _Break_Timeout erhält.

_Break_Timeout

interval DEFAULT

'99999:00:00'

Zeitpunkt, nachdem der Cursorlauf unterbrochen werden soll. Z.B. um einen Fortschrittsbalken zu steuern oder den Abbruch zu erlauben.

Die Daten der zuletzt bearbeiteten Maschine werden jedoch immer vervollständigt und können den Timeout hinauszögern. Somit führt ein _BreakTimeout von ‘0:0:0‘ zu einem Abbruch pro Maschine in _mcids.
Empfehlung: _BreakTimeout >= ‘0:0:10‘
Wegen dem Aufwand für Unterbrechen und Fortsetzen bei Erstellung der Secondary Database.

Beispielcode sample_curser.sql

Erstellt die sekundären DB-Tabellen in einer Schleife.

DO

$do$

DECLARE

_Iterator int =999999;

BEGIN
WHILE _Iterator > 0 LOOP

_Iterator :=
(
    SELECT * from skrpps_02.skr_create_secundary_db_tables
    (
        'report_01'::text                             -- _Dest_Schema
        ,'sample'::text                                 -- _sTable_Prefix
        ,'eUnlogged'::skrpps_02.e_sec_tabletype    -- _eTable_Schema
        ,'skr_archive'::text                         -- _sSrc_Schema
        ,ARRAY[1399537134,1399537135,1399537136]    -- _mcids integer[]
        ,'2014-06-27 09:30:00'::timestamp         -- _starttime
        ,'2014-06-27 13:00:00'::timestamp         -- _endtime
        ,_Iterator                                        -- _Iterator integer
        ,'10'::interval                                 -- _Break_Timeout
    )

);

raise notice 'IteratorPos: % ',_Iterator ;
END LOOP;
END
$do$

Das Beispiel ist in pgSql geschrieben und kann mit Hilfe von pgAdmin3.exe als SQL-Skript ausgeführt werden.

Während der Ausführung wird nach jeder abgearbeiteten Maschine eine Fortschrittsmessage ausgegeben (Code: raise notice 'IteratorPos: % ',_Iterator).

Nach fehlerfreier Ausführung dieses Skript Beispiels, sind im Schema report_01 die Tabellen neu erzeugt:

Wichtig: