Creazione di tabelle ausiliari analitiche (corsa del cursore - UDF)

La UDF (funzione personalizzata) skrpps_02.skr_create_secundary_db_tables(…) genera quattro tabelle intermedie.
Queste tabelle interpretano dati non elaborati per il periodo di tempo selezionato e le macchine specificate. Su di esse si basano i report da eseguire qui di seguito.

Questa funzione è implementata in pgSql, richiama comunque internamente anche le UDF, implementate a loro volta in C++.

UDF e parametri di richiamo

UDF:skrpps_02.skr_create_secundary_db_tables(…)

Parametri

Tipo

Descrizione

_sDest_Schema

text

Schema nel quale devono essere archiviate le tabelle create. Quando si creano tabelle provvisorie, _sDestSchema deve essere sempre == ‘‘

_sTable_Prefix

text,

Prefisso delle tabelle create

_eTable_Type

skrpps_02.e_sec_tabletype

  • 'eUnlogged' per normali tabelle non registrate
  • 'eUnloggedTemp' per tabelle provvisorie

_sSrc_Schema

text

Schema di origine ('skr' o 'skr_archive')

_mcids

integer[]

ID macchina SKR delle macchine che si intende registrare nel database secondario.

_starttime

starttime timestamp without time zone

Ora/data di inizio dei dati

_endtime

starttime timestamp without time zone

Ora/data di fine dei dati

_Iterator
[in]

integer DEFAULT 999999

Con l'ausilio dell'iteratore è possibile frammentare la corsa del cursore su più richiami singoli di skr_create_secondary_db_tables(…), ad es. per realizzare una barra di avanzamento.
Dalla quantità di macchine in _mcids viene contato alla rovescia fino a 0. Il nuovo valore dell'iteratore è il valore di ritorno (return) di questa UDF ricevuta al termine del _Break_Timeout.

_Break_Timeout

interval DEFAULT

'99999:00:00'

Momento in cui deve essere interrotta la corsa del cursore.

I dati di una macchina vengono tuttavia lavorati sempre fino in fondo. In questo senso, un _BreakTimeout di ‘0:0:0‘ comporta sempre un'interruzione per ciascuna macchina in _mcids.
Suggerimento: _BreakTimeout >= ‘0:0:10‘
Per via del dispendio di tempo dovuto a interruzione e riavvio durante la creazione del Secondary Database

Codice a titolo di esempio sample_curser.sql

Crea le tabelle database secondarie in un loop.

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$

L'esempio è scritto in pgSql e può essere eseguito con l'ausilio di pgAdmin3.exe come script SQL.

Durante l'esecuzione viene emesso per ciascuna delle macchine in lavorazione un messaggio di avanzamento (codice: raise notice 'IteratorPos: % ',_Iterator).

Dopo un'esecuzione corretta di questo esempio di script, nello schema report_01 vengono nuovamente create le tabelle:

Importante: