return: text lang: plpgsql src: | DECLARE result TEXT; _champs TEXT[]; _i INTEGER; _table TEXT; _champ TEXT; _affectations TEXT; _selects TEXT; _tests TEXT; _joins TEXT; _sqlcmd TEXT; _affected_rows bigint; BEGIN -- Salariés sans profil UPDATE rh.p_salaries SET profil_id = 0 WHERE profil_id IS NULL; INSERT INTO rh.p_profils(oid) SELECT 0 WHERE 0 NOT IN (SELECT oid FROM rh.p_profils) AND 0 IN (SELECT profil_id FROM rh.p_salaries WHERE profil_id = 0); -- Initialisation des champs _champs = Array[ 't_types_contrat', 'type_contrat', 't_motifs_debut_contrat', 'motif_debut', 't_motifs_fin_contrat', 'motif_fin', 't_qualifications', 'qualification', 't_services', 'service', 't_specialites', 'specialite', 't_types_temps_travail', 'type_temps_travail', 't_categories_socio_professionnelle', 'categorie_socio_professionnelle', 't_statuts', 'statut', 't_codes_emploi', 'code_emploi', 't_societes_interim', 'societe_interim', 't_sections_analytiques_paie', 'section_analytique_paie', 't_sections_analytiques', 'section_analytique', 't_grilles', 'grille', 't_grilles_groupes', 'grille_groupe', 't_types_horaire', 'type_horaire', 't_groupes_cotisant', 'groupe_cotisant', 't_cadre_emploi', 'cadre_emploi', 't_categorie_conge', 'categorie_conge', 't_categorie_statutaire', 'categorie_statutaire', 't_commission_paritaire', 'commission_paritaire', 't_compte', 'compte_salarie', 't_filiere', 'filiere', 't_lettre_budgetaire', 'lettre_budgetaire', 't_unite_fonctionnelle', 'unite_fonctionnelle' ]; _i = 0; _affectations = ''; _selects = ''; _joins = ''; _tests = ''; WHILE _i <= 48 LOOP _i = _i + 1; _table = _champs[_i]; _i = _i + 1; _champ = _champs[_i]; IF _affectations <> '' THEN _affectations = _affectations || ', ' || chr(10); END IF; IF _selects <> '' THEN _selects = _selects || ', ' || chr(10); END IF; IF _tests <> '' THEN _tests = _tests || ' OR ' || chr(10); END IF; _affectations = _affectations || _champ || '_id = new_' || _champ || '_id, ' || chr(10); _affectations = _affectations || _champ || '_code = new_' || _champ || '_code, ' || chr(10); _affectations = _affectations || _champ || '_texte = new_' || _champ || '_texte'; _selects = _selects || 'COALESCE(' || _table || '.oid,0) AS new_' || _champ || '_id, ' || chr(10); _selects = _selects || 'COALESCE(' || _table || '.code,' || _table || '_0.code) AS new_' || _champ || '_code, ' || chr(10); _selects = _selects || 'COALESCE(' || _table || '.texte,' || _table || '_0.texte) AS new_' || _champ || '_texte'; _joins = _joins || chr(10) || 'LEFT JOIN rh.' || _table || ' ' || _table || '_0 ON ' || _table || '_0.oid = 0'; _joins = _joins || chr(10) || 'LEFT JOIN rh.' || _table || ' ON ' || _table || '.code_original = ' || _champ || '_code_original'; _tests = _tests || _champ || '_id IS DISTINCT FROM new_' || _champ || '_id OR ' || chr(10); _tests = _tests || _champ || '_code IS DISTINCT FROM new_' || _champ || '_code OR ' || chr(10); _tests = _tests || _champ || '_texte IS DISTINCT FROM new_' || _champ || '_texte'; END LOOP; _sqlcmd = 'UPDATE rh.p_profils SET' || chr(10); _sqlcmd = _sqlcmd || _affectations || chr(10); _sqlcmd = _sqlcmd || 'FROM (' || chr(10); _sqlcmd = _sqlcmd || 'SELECT' || chr(10); _sqlcmd = _sqlcmd || 'p_profils.oid AS new_profil_id,' || chr(10); _sqlcmd = _sqlcmd || _selects || chr(10); _sqlcmd = _sqlcmd || 'FROM rh.p_profils' || chr(10); _sqlcmd = _sqlcmd || _joins || chr(10); _sqlcmd = _sqlcmd || ') subview' || chr(10); _sqlcmd = _sqlcmd || 'WHERE p_profils.oid = new_profil_id AND' || chr(10); _sqlcmd = _sqlcmd || '(' || _tests || ')'; EXECUTE _sqlcmd; GET DIAGNOSTICS _affected_rows = ROW_COUNT; return (_affected_rows::text || ' ligne(s) modifiée(s)')::text; END;