return: text lang: plpgsql src: | DECLARE _nbPlanAna integer; -- Nb de plans analytiques possibles. _templateName text; -- Nom de la vue SQL template. _template text; -- source SQL template à compléter par cette fonction. _opt_mode text; -- Option t_divers définissant quelle vue SQL source est à prendre _viewName text; -- Nom de la vue à créer. _sqlView text; -- SQL de la vue à créer. _tmpRatio text; -- Ratio à appliquer. _tmpSelectId text[]; -- Colonnes à ajouter. _tmpSelectCode text[]; -- Colonnes à ajouter. _tmpSelectTexte text[]; -- Colonnes à ajouter. _tmpJoin text; -- Jointure à utiliser. result text; BEGIN _nbPlanAna = 3; -- Actuellement on gère 3 plans analytiques maximum. _templateName = 'v_historique_paie_0'; -- Par défaut, le template SQL à récupérer est situé dans cette vue. _opt_mode = ''; -- Par défaut, on prend la vue standard. -- Récupération de l'option. SELECT CASE WHEN valeur != '0' THEN '_1' ELSE '' END INTO _opt_mode FROM rh.t_divers WHERE code = 'OPT_STD_HP'; -- Récupération du template. SELECT pg_get_viewdef(c.oid, true) INTO _template FROM pg_class c JOIN pg_namespace as n on n.oid = c.relnamespace WHERE n.nspname = 'rh' AND c.relname = _templateName||coalesce(_opt_mode, ''::text); -- La vue v_historique_paie_0 est un template dans lequel il faut remplace "* 999" et "JOIN ( SELECT 1) subq ON 1 = 1" par les bonnes valeurs. FOR i IN 1..2^_nbPlanAna LOOP _tmpRatio = ''; _tmpSelectId = null; _tmpSelectCode = null; _tmpSelectTexte = null; _tmpJoin = ''; _sqlView = ''; IF (i::bit(3) = 0::bit(3)) THEN _viewName = 'rh.v_historique_paie_1'; ELSE _viewName = 'rh.v_historique_paie_1_' || i::bit(3)::text; END IF; FOR j IN 1.._nbPlanAna LOOP IF (substr(i::bit(3)::text, j, 1) = '1') THEN _tmpRatio = _tmpRatio || ' * v' || j::text || '.ratio'; _tmpSelectId[j] = 'v' || j::text || '.section_analytique_id as ng_section_analytique_' || j::text || '_id, v' || j::text || '.section_analytique_section_id as ng_section_analytique_' || j::text || '_section_id'; _tmpSelectCode[j] = 'v' || j::text || '.section_analytique_code as ng_section_analytique_' || j::text || '_code, v' || j::text || '.section_analytique_section_code as ng_section_analytique_' || j::text || '_section_code'; _tmpSelectTexte[j] = 'v' || j::text || '.section_analytique_texte as ng_section_analytique_' || j::text || '_texte, v' || j::text || '.section_analytique_section_texte as ng_section_analytique_' || j::text || '_section_texte'; _tmpJoin = _tmpJoin || ' JOIN rh.p_ventilation_section AS v' || j::text || ' ON v' || j::text || '.ventilation_id = p_historique_paie.ventilation_'|| j::text ||'_id'; ELSE _tmpSelectId[j] = 'null::bigint as ng_section_analytique_' || j::text || '_id'; _tmpSelectCode[j] = 'null::text as ng_section_analytique_' || j::text || '_code'; _tmpSelectTexte[j] = 'null::text as ng_section_analytique_' || j::text || '_texte'; END IF; END LOOP; -- Remplacements _sqlView = replace (_template, '* 999', _tmpRatio); _sqlView = replace (_sqlView, '999::bigint', array_to_string(_tmpSelectId, ', ', 'null::bigint')); _sqlView = replace (_sqlView, '''section_analytique_ng_code''::text', array_to_string(_tmpSelectCode, ', ', 'null::text')); _sqlView = replace (_sqlView, '''section_analytique_ng_texte''::text', array_to_string(_tmpSelectTexte, ', ', 'null::text')); _sqlView = replace (_sqlView, 'JOIN ( SELECT 1) subq ON 1 = 1', _tmpJoin); _sqlView = replace (_sqlView, ' AS to_replace_id', ''); _sqlView = replace (_sqlView, ' AS to_replace_code', ''); _sqlView = replace (_sqlView, ' AS to_replace_texte', ''); -- Suppression de la vue si elle existe. EXECUTE 'DROP VIEW IF EXISTS ' || _viewName; -- Création de la vue. EXECUTE 'CREATE VIEW ' || _viewName || ' AS ' || _sqlView; END LOOP; RETURN 'OK'; END;