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. |
_eTable_Type |
skrpps_02.e_sec_tabletype |
|
_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. |
_starttime |
starttime timestamp without time zone |
Startzeitpunkt der Daten |
_endtime |
starttime timestamp without time zone |
Endzeitpunkt der Daten |
_Iterator |
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. |
_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. |
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:
- sample_collected_chg_counts
- sample_collected_filter_rows
- sample_collected_machine_data
- sample_metadata
Wichtig:
- Diese Schleife sollten Sie mit einem _Break_Timeout von ca. 10 Sekunden implementieren.
- Abweichend von diesem Beispiel
Die sekundären DB-Tabellen sollten Sie als temporäre Postgres-Tabellen angelegen. - (_sDest_Schema -> '', _eTable_Schema -> 'eUnloggedTemp'),
- Damit der Speicher nach Schließen der Verbindung zur Datenbank automatisch wieder freigegeben wird.
- Andernfalls müssen Sie die erstellten Tabellen im zugewiesenen Schema _sDest_Schema manuell löschen, sobald die Tabellen nicht mehr benötigt werden.