Generar tablas auxiliares de evaluación (curso del cursor - UDF)
La UDF (función definida por el usuario) skrpps_02.skr_create_secundary_db_tables(…) genera cuatro tablas intermedias
Estas tablas preparan datos sin procesar para el período de tiempo seleccionado y las máquinas indicadas. Los reportes que deben ser realizados a continuación se basan sobre esto.
Esta función está implementada en pgSql, pero internamente también llama UDF, que están implementadas en C++.
UDF y parámetros de llamada
UDF:skrpps_02.skr_create_secundary_db_tables(…)
Parámetro | Tipo | Descripción |
---|---|---|
_sDest_Schema | text | Esquema en el cual se deben guardar las tablas generadas. Cuando se generan tablas temporales, _sDestSchema siempre tiene que ser == ‘‘. |
_sTable_Prefix | text, | Prefijo de las tablas generadas |
_eTable_Type | skrpps_02.e_sec_tabletype |
|
_sSrc_Schema | text | Esquema de Source (‚skr‘ o ‚skr_archive‘) |
_mcids | integer[] | IDs de máquinas del SKR de las máquinas que deben ser incluidas en la base de datos secundaria. |
_starttime | starttime timestamp without time zone | Hora de inicio de los datos |
_endtime | starttime timestamp without time zone | Hora de finalización de los datos |
_Iterator | integer DEFAULT 999999 | Con la ayuda del iterador, el curso del cursor puede ser dividido en varias llamadas individuales de skr_create_secondary_db_tables(…). P. ej. para realizar una barra de progreso. |
_Break_Timeout | interval DEFAULT '99999:00:00' | Momento después del cual el curso del cursor debe ser interrumpido. Los datos de una máquina, sin embargo, siempre son procesadas completamente. Por consiguiente un _BreakTimeout de ‘0:0:0‘ lleva a una cancelación por máquina en _mcids. |
Código de ejemplo sample_curser.sql
Genera las tablas de base de datos secundarias en un bucle.
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$
El ejemplo está escrito en pgSql y puede ser ejecutado con la ayuda de pgAdmin3.exe como script SQL.
Durante la ejecución se emite un mensaje de progreso después de cada máquina procesada (código: raise notice 'IteratorPos: % ',_Iterator).
Después de una ejecución sin errores de este ejemplo de script, en el esquema report_01 se generaron nuevamente las tablas:
- sample_collected_chg_counts
- sample_collected_filter_rows
- sample_collected_machine_data
- sample_metadata
Importante:
- Deberá implementar este bucle con un _Break_Timeout de aprox. 10 segundos.
- Como desviación de este ejemplo
Debería guardar las tablas DB secundarias como tablas Postgres temporales. - (_sDest_Schema=='', _eTable_Schema == 'eUnloggedTemp'),
- Para que la memoria automáticamente vuelva a ser liberada después de cerrar la conexión.
- De lo contrario deberá eliminar manualmente las tablas generadas en el esquema _sDest_Schema asignado una vez qua las tablas ya no sean necesarias.